我需要在python脚本中运行外部exe文件。我需要两件事。
这是我到目前为止所做的事情,我不知道该怎么做。
import subprocess
first = subprocess.Popen(["myexe.exe"],shell=True,stdout=subprocess.PIPE)
答案 0 :(得分:1)
from subprocess import Popen, PIPE, STDOUT
first = Popen(['myexe.exe'], stdout=PIPE, stderr=STDOUT, stdin=PIPE)
while first.poll() is None:
data = first.stdout.read()
if b'press enter to' in data:
first.stdin.write(b'\n')
first.stdin.close()
first.stdout.close()
这个管道stdin
也是,不忘记关闭打开的文件句柄(stdin和stdout在某种意义上也是文件句柄)。
如果可能的话,也要避免使用shell=True
,我会自己使用它best practices say you shouldn't。
我在这里假设python 3而stdin
和stdout
假设字节数据作为输入和输出。
first.poll()
将轮询您的exe的退出代码,如果没有给出它意味着它仍在运行。
一件单调乏味的事情可以是向Popen传递论据,一件好事要做:
import shlex
Popen(shlex.split(cmd_str), shell=False)
它保留了带有引号的空格分隔输入,例如python myscript.py debug "pass this parameter somewhere"
将导致来自sys.argv
,['myscript.py', 'debug', 'pass this parameter somewhere']
的三个参数 - 在将来使用{{1}时可能会有用}}
另一件好事是在读取之前检查Popen
中是否有输出,否则它可能会挂起应用程序。为此,您可以使用select
或者您可以使用经常与SSH一起使用的pexpect,因为当它请求输入时,它位于应用程序之外的另一个用户空间中,您需要手动分叉您的exe并使用{{1}从该特定的pid读取或使用stdout
。