subprocess.run() 中的 CompletedProcess 不返回字符串

新手上路,请多包涵

根据 Python 3.5 文档,subprocess.run() 返回一个 CompletedProcess 对象,其 stdout 成员包含“一个字节序列,或者一个字符串,如果 run() 是使用 universal_newlines=True 调用的。”我只看到一个字节序列而不是一个字符串,我假设(希望)它等同于一个文本行。例如,

 import pprint
import subprocess

my_data = ""
line_count = 0

proc = subprocess.run(
         args = [ 'cat', 'input.txt' ],
         universal_newlines = True,
         stdout = subprocess.PIPE)

for text_line in proc.stdout:
    my_data += text_line
    line_count += 1

word_file = open('output.txt', 'w')
pprint.pprint(my_data, word_file)
pprint.pprint(line_count, word_file)

注意:这使用了 Python 3.5 中的一项新功能,该功能不会在以前的版本中运行。

我需要创建自己的行缓冲逻辑,还是有办法让 Python 为我做这件事?

原文由 highpost 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

proc.stdout 在你的情况下已经是一个字符串,运行 print(type(proc.stdout)) ,以确保。它包含所有子进程的输出 -- subprocess.run() 在子进程死亡之前不会返回。

for text_line in proc.stdout: 不正确: for char in text_string 枚举 Python 中的字符(Unicode 代码点),而不是行。要获取线路,请致电:

 lines = result.stdout.splitlines()

如果字符串中有 Unicode 换行符,结果可能与 .split('\n') 不同。

如果您想逐行读取输出(以避免长时间运行的进程耗尽内存):

 from subprocess import Popen, PIPE

with Popen(command, stdout=PIPE, universal_newlines=True) as process:
    for line in process.stdout:
        do_something_with(line)

注意: process.stdout 在这种情况下是一个类文件对象。 Popen() 不等待进程完成 -- Popen() 子进程启动后立即返回。 process 是一个 subprocess.Popen 实例,而不是 CompletedProcess 在这里。

如果您只需要计算输出中的行数(由 b'\n' 终止),例如 wc -l

 from functools import partial

with Popen(command, stdout=PIPE) as process:
    read_chunk = partial(process.stdout.read, 1 << 13)
    line_count = sum(chunk.count(b'\n') for chunk in iter(read_chunk, b''))

请参阅 为什么在 C++ 中从 stdin 读取行比 Python 慢得多?

原文由 jfs 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您需要在数组中包含 STDOUT 行以更好地操作它们,您只是想念通过“通用换行符”分隔符拆分输出

nmap_out = subprocess.run(args = ['nmap', '-T4', '-A', '192.168.1.128'],
                              universal_newlines = True,
                              stdout = subprocess.PIPE)

nmap_lines = nmap_out.stdout.splitlines()
print(nmap_lines)

输出是:

 ['Starting Nmap 7.01 ( https://nmap.org ) at 2016-02-28 12:24 CET', 'Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn', 'Nmap done: 1 IP address (0 hosts up) scanned in 2.37 seconds']

原文由 Rider 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏