如何使用子进程和 Popen 从我的.exe获取所有输出?



我正在尝试运行可执行文件并使用subprocess.Popen捕获其输出;但是,我似乎没有得到所有的输出。

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

手动打开时,它打印的比原始exe文件少两行。

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

f = open('myprogram_output.txt','w')
proc = Popen('C:ToolsDvb_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)

请在下面选择流文件编号:

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:网络ID已感兴趣
-R0xYYYY:旧Pid已替换为
此PID-GDD
:通用计数(1 - 1000)

所以我们可以看到缺少一些线条。我必须写 1 并选择值后请选择下面的富尔数字出现。

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

新代码:

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

谢谢塞巴斯蒂安。我能够看到整个输出,但无法输入任何带有当前代码的输入。

将所有标准输出作为字符串获取:

from subprocess import check_output as qx
cmd = r'C:ToolsDvb_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添加到合并 stdout/stderr 的Popen()调用中。

注意:如果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="1nn")
print("stdout: %rnstderr: %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')

要发送特殊键,例如F3F10在 Windows 上,您可能需要SendKeys模块或其纯 Python 实现SendKeys-ctypes。像这样:

from SendKeys import SendKeys
SendKeys(r"""
{LWIN}
{PAUSE .25}
r
C:ToolsDvb_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:ToolsDvb_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 四处闲逛,以获得一些与您所做的事情相匹配的用途。

最新更新