您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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=STDOUTPopen()合并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模块。这是docs示例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}
""")

它不捕获输出

其他 2022/1/1 18:29:19 有446人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶