Aji*_*ith 1 python windows subprocess popen
我正在尝试运行可执行文件并使用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
Run Code Online (Sandbox Code Playgroud)
手动打开时,它会打印比原始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()
Run Code Online (Sandbox Code Playgroud)
谁能帮助我获取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
Run Code Online (Sandbox Code Playgroud)
-S0xYYYY:服务ID感兴趣
-T0xYYYY:传输ID感兴趣
-N0xYYYY:网络ID感兴趣
-R0xYYYY:旧的Pid被此PID
-Gdd 替换:通用计数(1 - 1000)
所以我们可以看到一些缺失的线条.我必须写1并选择值后请选择下面显示的fule数字.
我试图使用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))
Run Code Online (Sandbox Code Playgroud)
谢谢塞巴斯蒂安.我能够看到整个输出,但无法使用当前代码输入任何输入.
jfs*_*jfs 15
要将所有标准输出作为字符串:
from subprocess import check_output as qx
cmd = r'C:\Tools\Dvb_pid_3_0.exe'
output = qx(cmd)
Run Code Online (Sandbox Code Playgroud)
要将stdout和stderr作为单个字符串:
from subprocess import STDOUT
output = qx(cmd, stderr=STDOUT)
Run Code Online (Sandbox Code Playgroud)
要将所有行作为列表:
lines = output.splitlines()
Run Code Online (Sandbox Code Playgroud)
要获取子流程打印的行:
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))
Run Code Online (Sandbox Code Playgroud)
添加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,
Run Code Online (Sandbox Code Playgroud)
如果cmd
总是需要输入,即使是空的; 设定stdin
:
import os
with open(os.devnull, 'rb') as DEVNULL:
output = qx(cmd, stdin=DEVNULL) # use subprocess.DEVNULL on Python 3.3+
Run Code Online (Sandbox Code Playgroud)
您可以组合这些解决方案,例如,合并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)
Run Code Online (Sandbox Code Playgroud)
要将所有输入作为单个字符串提供,您可以使用以下.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))
Run Code Online (Sandbox Code Playgroud)
其中test.py
:
print raw_input('abc')[::-1]
raw_input('press enter to exit')
Run Code Online (Sandbox Code Playgroud)
如果您与该程序的交互更像是一个对话而不是您可能需要的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')
Run Code Online (Sandbox Code Playgroud)
要在Windows上发送特殊键F3
,F10
您可能需要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}
""")
Run Code Online (Sandbox Code Playgroud)
它不捕获输出.
归档时间: |
|
查看次数: |
15605 次 |
最近记录: |