pfl*_*rre 30 python subprocess
可能重复:
包装子进程'stdout/stderr
在这个问题中,hanan-n询问是否可以将python子进程输出到stdout,同时还将输出保存在字符串中以便以后处理.在这种情况下,解决方案是遍历每个输出行并手动打印它们:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
Run Code Online (Sandbox Code Playgroud)
但是,此解决方案并未概括为您要为stdout和stderr执行此操作的情况,同时满足以下条件:
我查看了子进程文档,但找不到任何可以实现此目的的东西.我能找到的最接近的是添加stderr=subprocess.stdout和使用与上面相同的解决方案,但是我们失去了常规输出和错误之间的区别.有任何想法吗?我猜测解决方案 - 如果有的话 - 将涉及异步读取p.stdout和p.stderr.
这是我想做的一个例子:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]
Run Code Online (Sandbox Code Playgroud)
Tho*_*ele 35
这个例子似乎对我有用:
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
import subprocess
import sys
import select
p = subprocess.Popen(["find", "/proc"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = []
stderr = []
while True:
reads = [p.stdout.fileno(), p.stderr.fileno()]
ret = select.select(reads, [], [])
for fd in ret[0]:
if fd == p.stdout.fileno():
read = p.stdout.readline()
sys.stdout.write('stdout: ' + read)
stdout.append(read)
if fd == p.stderr.fileno():
read = p.stderr.readline()
sys.stderr.write('stderr: ' + read)
stderr.append(read)
if p.poll() != None:
break
print 'program ended'
print 'stdout:', "".join(stdout)
print 'stderr:', "".join(stderr)
Run Code Online (Sandbox Code Playgroud)
一般情况下,如果你想同时使用多个文件描述符并且你不知道哪个会有东西供你阅读,你应该使用select或类似的东西(如Twisted reactor).
要以可移植的方式打印到控制台并在子进程的字符串stdout/stderr中捕获:
from StringIO import StringIO
fout, ferr = StringIO(), StringIO()
exitcode = teed_call(["the", "command"], stdout=fout, stderr=ferr)
stdout = fout.getvalue()
stderr = ferr.getvalue()
Run Code Online (Sandbox Code Playgroud)
teed_call()在Python子进程中定义的地方将子输出到文件和终端?
您可以使用任何类似文件的对象(.write()方法).
| 归档时间: |
|
| 查看次数: |
28612 次 |
| 最近记录: |