根据Python 3.5 docs,subprocess.run()返回一个带有标准输出成员的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)注意:这使用了Python3.5中的一个新特性,该特性不能在以前的版本中运行。
我是否需要创建自己的行缓冲逻辑,或者有没有办法让Python为我做这件事?
发布于 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代码点),而不是行。要获取线路,请调用:
lines = result.stdout.splitlines()如果字符串中有Unicode换行符,则结果可能与.split('\n')不同。
如果您想逐行读取输出(以避免长时间运行的进程耗尽内存):
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''))请参阅Why is reading lines from stdin much slower in C++ than Python?
发布于 2016-02-28 19:39:03
如果需要在数组中包含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']发布于 2015-12-05 08:12:55
您看到的是一个字符串,请比较:
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。
https://stackoverflow.com/questions/34099336
复制相似问题