如何使用subprocess和Popen从我的.exe文件获得所有输出?

我试图运行一个可执行文件,并使用subprocess.Popen捕获其输出; 然而,我似乎没有得到所有的输出。

 import subprocess as s from subprocess import Popen import os ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE) print 'pOpen done..' while: line = ps.stdout.readline() print line 

它手动打开时打印两行比原来的exe文件less。

我尝试了另一种方法,结果相同:

 f = open('myprogram_output.txt','w') proc = Popen('C:\Tools\Dvb_pid_3_0.exe ', stdout =f) line = proc.stdout.readline() print line f.close() 

任何人都可以请帮我得到exe的完整数据?

正如塞巴斯蒂安所问:

原始的exe文件最后几行o / p:

-Gdd:通用计数(1 – 1000)

-Cdd:从(0 – 99)开始剪切–Edd:在(1 – 100)

请select下面的stream文件编号:

1 – 。\ pdsx100-bcm7230-squashfs-sdk0.0.0.38-0.2.6.0-prod.sao.ts

运行后得到的o / p:

 -P0xYYYY : Pid been interested 

-S0XYYYY:服务ID有兴趣
-T0xYYYY:运输ID有兴趣
-N0xYYYY:networkingID感兴趣
-R0XYYYY:一个旧的PID被这个PID取代
-Gdd:通用计数(1 – 1000)

所以我们可以看到一些线路丢失。 出现以下select后,我必须写1并select数值。

我试图使用ps.stdin.write('1 \ n')。 它没有打印在exe文件中的值

新代码:

 #!/usr/bin/env python from subprocess import Popen, PIPE cmd = r'C:\Tools\Dvb_pid_3_0.exe' p = Popen(cmd, stdin=PIPE, stdout=None, stderr=None, universal_newlines=True) stdout_text, stderr_text = p.communicate(input="1\n\n") print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text)) if p.returncode != 0: raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode)) 

谢谢Sebastien。 我能够看到整个输出,但无法使用当前代码input任何input。

Solutions Collecting From Web of "如何使用subprocess和Popen从我的.exe文件获得所有输出?"

以字符串形式获得所有stdout:

 from subprocess import check_output as qx cmd = r'C:\Tools\Dvb_pid_3_0.exe' output = qx(cmd) 

要将stdout和stderr作为单个字符串:

 from subprocess import STDOUT output = qx(cmd, stderr=STDOUT) 

将所有行作为列表:

 lines = output.splitlines() 

在子流程中打印行时获取行:

 from subprocess import Popen, PIPE p = Popen(cmd, stdout=PIPE, bufsize=1) for line in iter(p.stdout.readline, ''): print line, p.stdout.close() if p.wait() != 0: raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode)) 

stderr=STDOUT添加到Popen()调用来合并stdout / stderr。

注意:如果cmd在非交互模式下使用块缓冲,那么行将不会出现,直到缓冲区刷新。 winpexpect模块可能能够很快得到输出。

将输出保存到文件中:

 import subprocess with open('output.txt', 'wb') as f: subprocess.check_call(cmd, stdout=f) # to read line by line with open('output.txt') as f: for line in f: print line, 

如果cmd总是需要输入,甚至是空的; 设置stdin

 import os with open(os.devnull, 'rb') as DEVNULL: output = qx(cmd, stdin=DEVNULL) # use subprocess.DEVNULL on Python 3.3+ 

你可以合并这些解决方案,例如,合并stdout / stderr,并将输出保存到一个文件,并提供一个空的输入:

 import os from subprocess import STDOUT, check_call as x with open(os.devnull, 'rb') as DEVNULL, open('output.txt', 'wb') as f: x(cmd, stdin=DEVNULL, stdout=f, stderr=STDOUT) 

要提供所有输入作为单个字符串,你可以使用.communicate()方法:

 #!/usr/bin/env python from subprocess import Popen, PIPE cmd = ["python", "test.py"] p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True) stdout_text, stderr_text = p.communicate(input="1\n\n") print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text)) if p.returncode != 0: raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode)) 

test.py

 print raw_input('abc')[::-1] raw_input('press enter to exit') 

如果您与程序的交互更像是一次谈话,那么您可能需要winpexpect模块 。 以下是pexpect文档的一个例子 :

 # This connects to the openbsd ftp site and # downloads the recursive directory listing. from winpexpect import winspawn as spawn child = spawn ('ftp ftp.openbsd.org') child.expect ('Name .*: ') child.sendline ('anonymous') child.expect ('Password:') child.sendline ('noah@example.com') child.expect ('ftp> ') child.sendline ('cd pub') child.expect('ftp> ') child.sendline ('get ls-lR.gz') child.expect('ftp> ') child.sendline ('bye') 

要在Windows上发送特殊键(如F3F10 ,可能需要SendKeys模块或其纯Python实现SendKeys-ctypes 就像是:

 from SendKeys import SendKeys SendKeys(r""" {LWIN} {PAUSE .25} r C:\Tools\Dvb_pid_3_0.exe{ENTER} {PAUSE 1} 1{ENTER} {PAUSE 1} 2{ENTER} {PAUSE 1} {F3} {PAUSE 1} {F10} """) 

它不捕获输出。

你的问题的缩进使我略微放弃了一些,因为Python是特别的。 你有没有尝试过这样的事情:

 import subprocess as s from subprocess import Popen import os ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE) print 'pOpen done..' (stdout, stderr) = ps.communicate() print stdout 

我认为stdout将是你从命令返回的任何一个字符串,所以这可能不是你想要的,因为readline()假定你想要一行一行地查看输出。

会建议为http://docs.python.org/library/subprocess.html寻找一些符合你的使用。