使用python执行后将enterKey传递给exe文件

时间:2016-04-12 05:17:29

标签: python subprocess

我需要在python脚本中运行外部exe文件。我需要两件事。

  1. 获取stdout(stderr)的exe输出。
  2. exe只有在按下回车键后才会停止执行。我无法改变这种行为。我需要脚本在获得上一步的输出后传递输入键输入。
  3. 这是我到目前为止所做的事情,我不知道该怎么做。

    import subprocess
    
    first = subprocess.Popen(["myexe.exe"],shell=True,stdout=subprocess.PIPE)
    

1 个答案:

答案 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而stdinstdout假设字节数据作为输入和输出。

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