子流程popen stdou

2024-10-01 22:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习subprocess,但我对以下代码有点困惑:

import subprocess

proc = subprocess.Popen('lspci', stdout=subprocess.PIPE)
for line in proc.stdout:
    print(line)

输出:

^{pr2}$

如您所见,输出是格式化的。但我不知道为什么结尾有b''和{}字符。在

如果我在终端上运行这个命令,就没有这些字符。在

正常输出:

00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller (rev 09)

我怎样才能去掉它们?在


Tags: corestdoutlinerevproc字符processorv2
3条回答

您可能正在使用python3-python改变了某些对象读/写数据的方式,现在有了一个真正的bytes()对象。要获得所需的字符串,只需:

print(line.decode("utf8")) ## or some encoding; that one should print anything though

您可能还需要从输出中去掉换行符(\n);我不记得stdout如何进行缓冲/报告:

^{pr2}$

b''是python3中bytes对象的文本表示。在

要按原样打印字节,请使用二进制流sys.stdout.buffer

#!/usr/bin/env python3
import sys
from subprocess import Popen, PIPE

with Popen('lspci', stdout=PIPE, bufsize=1) as process:
    for line in process.stdout: # b'\n'-terminated lines
        sys.stdout.buffer.write(line)
        # do something with line here..

要获得文本(Unicode字符串)的输出,可以使用universal_newlines=True参数:

^{pr2}$

locale.getpreferredencoding(False)字符编码用于解码输出。在

如果子进程使用不同的编码,则可以使用io.TextIOWrapper()显式指定它:

#!/usr/bin/env python3
import io
from subprocess import Popen, PIPE

with Popen('lspci', stdout=PIPE, bufsize=1) as process:
    for line in io.TextIOWrapper(process.stdout, encoding='utf-8'):
        print(line, end='')
        # do something with line here..

有关Python2代码和指向可能问题的链接,请参见Python: read streaming input from subprocess.communicate()

我认为您使用的是python 3:

b表示字节,它表示它是一个字节序列,它等价于Python2.6+中的普通字符串

https://docs.python.org/3/reference/lexical_analysis.html#literals

相关问题 更多 >

    热门问题