如何让所有使用子和POPEN我的.exe文件的输出?(How do I get all of the

2019-06-18 07:42发布

我试图运行可执行文件,并捕获使用其输出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文件少了两个行。

我试着用同样的结果的另一种方法:

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:AT切割端(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个\ 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))

由于塞巴斯蒂安。 我能看到整个输出,但不能在任何输入与当前的代码养活。

Answer 1:

要获得所有标准输出为一个字符串:

from subprocess import check_output as qx

cmd = r'C:\Tools\Dvb_pid_3_0.exe'
output = qx(cmd)

要获得这两个输出和错误作为一个字符串:

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=STDOUTPopen()调用合并标准输出/标准错误。

注意:如果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+

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

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')

要发送特殊键,如F3F10在Windows上,你可能需要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}
""")

它不能捕获输出。



Answer 2:

你的问题的压痕扔我一下,因为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为匹配您正在做什么,一些用途。



文章来源: How do I get all of the output from my .exe using subprocess and Popen?