[英]Python Popen stdout output coming in stderr
我必须使用python subprocess
tshark -D
捕获tshark -D
输出。 这是tshark -D
输出,
$ tshark -D 1. eth0 2. any (Pseudo-device that captures on all interfaces) 3. lo
并使用python它给出,
>>> import subprocess
>>> p = subprocess.Popen(["tshark", "-D"], stdout=subprocess.PIPE) ###1
>>> 1. eth0
2. any (Pseudo-device that captures on all interfaces)
3. lo
>>> p = subprocess.Popen(["tshark", "-D"], stderr=subprocess.PIPE,stdout=subprocess.PIPE) ###2
>>> p.stderr.read()
'1. eth0\n2. any (Pseudo-device that captures on all interfaces)\n3. lo\n'
>>> p.stdout.read()
''
在#1中,输入命令后,它给出输出。 在#2中,所需的输出来自stderr
。 为什么会给出这样的结果?
要获得所有输出,无论子进程是在stdout还是stderr上打印,您都可以使用stderr=STDOUT
和subprocess.check_output
:
from subprocess import check_output, STDOUT
all_output = check_output(['tshark', '-D'], stderr=STDOUT)
tshark
手册说:
-D打印TShark可以捕获的接口列表,然后退出。
它没有指定输出必须在stderr上。 虽然在我的系统上它只向stderr打印诊断信息。 可以保留Stdout来打印捕获的数据。
tshark -D
总是打印到stderr。 在#1的情况下,由于您没有捕获stderr,因此它将打印到您的控制台。
在#2的情况下,因为你捕获了stdout和stderr,stdout ==>''和stderr ==>输出。
对于#1:因为您没有处理标准管道和输出,所以打印出的命令将只在屏幕上打印出来。 如果要处理标准管道,则需要同时处理stdout和stderr。 否则你实际上无法捕获标准管道。 指定标准管道时,应同时处理标准错误打印输出。
如果您在名为“func_my.py”的模块下有一个函数,则下面更像是这样的:
def func_my():
print "Hello"
return "World"
if __name__ == "__main__":
func_my()
当您调用此函数时,如果您不处理控制台输出,字符串“hello”将直接显示在控制台输出中。
p = subprocess.Popen(["python", "func_my.py"], stdout=subprocess.PIPE)
这将始终打印“你好”。
对于#2:你确实捕获了标准输出和错误输出,但是你犯了一个错误。 你把所有的管道都放到了stdout和stderr上。 正确的方式应该是:
p = subprocess.Popen(["tshark", "-D"], stderr=subprocess.STDOUT,stdout=subprocess.PIPE)
p.stderr.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'read'
p.stdout.read()
"WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-UBTaGc/pkcs11: No such file or directory\ntshark: There are no interfaces on which a capture can be done\n"
希望能帮助你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.