背景
最近工作中有遇到这样一种情况,需要执行一个 exe 文件更改某些设置来触发某 Service 工作,而执行这个 exe 程序需要一个屏幕输入参数,这个输入参数也是需要 python 脚本生成的。如果每次都是 cmd 执行这个 exe 程序,把 python 生成的输入参数 copy到 cmd console 上,有些麻烦。所以就研究了一下 python 如何运行其它程序,提高一下工作效率,也增长点知识。
准备一个 bat 脚本
写个 Bat 脚本来实现除法运算,命名为 test.bat
@echo off
echo division calculator
set /p a=Please input divident a:
set /p b=Please input divisor b:
set /a result=%a%/%b%
echo Result a/b =%a%/%b% = %result%
pause
执行如下:
python os.system
python os.system 可以用来执行系统命令,但是没法传递屏幕输入参数,也没法获取程序执行输出结果。
用 os.system 来运行一下上面的 test.bat 文件
import os
result = os.system('test.bat')
print(result)
执行结果:
注意
需要手动输入两个参数,result的结果是 0,表示程序执行成功。
os.popen
用于从一个命令打开一个管道,返回结果是一个连接管道的文件对象,该文件对象的操作方法同open(),可以从该文件对象中读取返回结果。如果执行成功,不会返回状态码,如果执行失败,则会将错误信息输出到stdout,并返回一个空字符串。
import os
result = os.popen('test.bat')
print('ouput result:')
print(result.read())
执行结果,手动输入两个参数,可以看出屏幕结果都输出了。
异常输出:
subprocess
subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
一个简单的 test2.bat 文件
@echo off
set /p a=Please input a number:
echo your input is %a%
pause
Python 调用
import subprocess
p = subprocess.Popen(["test2.bat"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding="utf-8",universal_newlines=True)
stdout, stderr = p.communicate('12\n')
print(stdout)
不用手动输入input 参数了,还可以打印输出结果。
本人没法成功传两个输入参数,所以没法用上面的 test.bat 来演示了,这里有点遗憾,只能成功自动传入一个输入参数,如果有人知道请留言,不胜感激。