当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《subprocess.run()中的CompletedProcess不返回字符串》经验,为你挑选了1个好方法。

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

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为我做这个吗?



1> jfs..:

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()

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

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

from subrocess 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要慢得多?

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有