当前位置: 首页 > 知识库问答 >
问题:

子流程popen stdout

咸昀
2023-03-14

我正在学习子流程,但我对这段代码有点困惑:

import subprocess

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

输出:

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

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

如果我在终端中运行此命令,则没有这些字符。

正常输出:

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)

我怎样才能移除它们?

共有3个答案

哈翔
2023-03-14

我认为您使用的是python 3:

b代表字节,表示它是一个字节序列,相当于Python 2.6中的普通字符串

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

龚博涛
2023-03-14

b"是Python 3中字节对象的文本表示形式。

要按原样打印字节,请使用二进制流--sys。斯特杜特。缓冲区

#!/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参数:

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

with Popen('lspci', stdout=PIPE, bufsize=1, universal_newlines=True) as process:
    for line in process.stdout: # b'\n', b'\r\n', b'\r' are recognized as newline
        print(line, end='')
        # do something with line here..

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。沟通

郑向阳
2023-03-14

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

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

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

print(line.decode("utf8").strip())
 类似资料:
  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 问题内容: 在python中,是否有一种方法可以调用一个新进程,在同一个上下文中处理它,例如标准IO流,关闭当前进程,并控制所调用的进程?这将有效地“替代”该过程。 我有一个要重复其行为的程序。但是,它使用了一个第三方库,而且看来,我真正能够杀死该库调用的线程的唯一方法是退出()我的python进程。 另外,它似乎可以帮助管理内存。 问题答案: 您可能对以下朋友感兴趣: 这些功能都执行一个新程序,

  • 问题内容: 我试图通过Python调用带有多个参数的进程。执行批处理文件本身对我来说很好,但是将其翻译成Python会让我大叫。这里是批处理文件的内容: 批处理文件运行的可执行文件名为。可执行文件的输出提供以下信息:– backend 。 另请注意,某些参数是字符串,而有些则不是。 解 现在对我有用: 问题答案: 在Windows中执行批处理文件: 如果您不想执行批处理文件,而是直接从Python

  • 问题内容: 我的python脚本(python 3.4.3)通过子进程调用bash脚本: 该 bashscript 包含以下行: 这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。 执行python脚本时,它将提示输入该行的密码,但是在输入密码后它将阻塞,并且永远不会返回。当我按ctrl- C终止脚本时,我看到连接已正确建立(因此行已成功执行)。 使用代替时,我没有此阻塞问题,但不检索标

  • 问题内容: 我想在子目录/超级目录中执行脚本(我需要先在此子目录/超级目录中)。我无法进入子目录: Python抛出OSError,我不知道为什么。无论是尝试进入现有的子目录还是进入一个目录(如上所述)都没有关系-我总是会遇到相同的错误。 问题答案: 您的代码尝试执行的操作是调用名为的程序。您想要的是称为的命令。 但是是外壳内部的。所以你只能称它为 但这是没有意义的。 由于没有进程可以更改另一个进

  • 问题内容: 我了解到,在Python中执行命令时,应该使用子进程。我想要实现的是通过ffmpeg对文件进行编码,并观察程序输出,直到文件完成。Ffmpeg将进度记录到stderr。 如果我尝试这样的事情: 调用child.communicate()后,程序无法继续执行,并等待命令完成。还有其他方法可以跟踪输出吗? 问题答案: communication()阻塞直到子进程返回,所以循环中的其余各行仅