首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自subprocess.run()的CompletedProcess不返回字符串

来自subprocess.run()的CompletedProcess不返回字符串
EN

Stack Overflow用户
提问于 2015-12-05 07:42:07
回答 3查看 28.6K关注 0票数 13

根据Python 3.5 docs,subprocess.run()返回一个带有标准输出成员的CompletedProcess对象,其中包含“一个字节序列,如果用universal_newlines=True调用了run(),则返回一个字符串。”我只看到一个字节序列,而不是一个字符串,我假设(希望)它等同于一个文本行。例如,

代码语言:javascript
复制
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)

注意:这使用了Python3.5中的一个新特性,该特性不能在以前的版本中运行。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-06 19:35:20

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

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

代码语言:javascript
复制
lines = result.stdout.splitlines()

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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''))

请参阅Why is reading lines from stdin much slower in C++ than Python?

票数 18
EN

Stack Overflow用户

发布于 2016-02-28 19:39:03

如果需要在数组中包含STDOUT行以便更好地操作它们,那么您只需使用“通用换行符”分隔符来分割输出即可

代码语言:javascript
复制
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)

输出为:

代码语言:javascript
复制
['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']
票数 5
EN

Stack Overflow用户

发布于 2015-12-05 08:12:55

您看到的是一个字符串,请比较:

代码语言:javascript
复制
import subprocess
proc = subprocess.run(
    args = [ 'cat', 'input.txt' ],
    universal_newlines = False,
    stdout = subprocess.PIPE)

print (type(proc.stdout))

类“bytes”

运行调用popen.communicate

通信()返回一个元组(stdout_data,stderr_data)。数据将是字节,如果universal_newlines为True,则为字符串。

有关更多解释和其他shell交互,请查看here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34099336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档