我正在尝试读取Python中名为的子进程的输出。为此,我使用了Popen (因为我不认为如果使用subprocess.call就不可能通过管道输出标准输出)。
到目前为止,我有两种方法,在测试中,似乎提供了相同的结果。代码如下:
with Popen(['Robocopy', source, destination, '/E', '/TEE', '/R:3', '/W:5', '/log+:log.txt'], stdout=PIPE) as Robocopy:
for line in Robocopy.stdout:
line = line.decode('ascii')
message_list = [item.strip(' \t\n').replace('\r', '') for item in line.split('\t') if item != '']
print(message_list[0], message_list[0])
Robocopy.wait()
returncode = Robocopy.returncode和
with Popen(['Robocopy', source, destination, '/E', '/TEE', '/R:3', '/W:5', '/log+:log.txt'], stdout=PIPE, universal_newlines=True, bufsize=1) as Robocopy:
for line in Robocopy.stdout:
message_list = [item.strip() for item in line.split('\t') if item != '']
print(message_list[0], message_list[2])
Robocopy.wait()
returncode = Robocopy.returncode正如文档所述,第一种方法不包含universal_newlines=True,这是only usable if universal_newlines=True i.e., in a text mode。
第二个版本包含universal_newlines,因此我指定了bufsize。
有人能给我解释一下其中的区别吗?我找不到这篇文章,但我确实读到过关于缓冲区溢出问题的文章,这会导致某种问题,并因此认识到使用for line in stdout的重要性。
此外,在查看输出时,不指定universal_newlines会使标准输出成为bytes对象-但我不确定如果我只使用ascii (在新行和制表符方面)解码bytes对象与universal_newlines模式相比会有什么不同。
最后,将bufsize设置为1会使输出“行缓冲”,但我不确定这是什么意思。如果能解释一下这些不同的元素是如何联系在一起的,我会很感激的。谢谢
发布于 2016-07-04 18:31:37
使用universal_newlines=True (带bufsize=1)和使用默认参数打开有什么区别
默认值是:universal_newlines=False (表示输入/输出被接受为字节,而不是Unicode字符串加上universal newlines mode处理(参数的名称由此而来。Python3.7提供了text别名,这在这里可能更直观)被禁用--您可以按原样获得二进制数据(除非Windows上的POSIX层弄乱了它)和bufsize=-1 (意味着流是完全缓冲的--使用默认的缓冲区大小)。
universal_newlines=True使用locale.getpreferredencoding(False)字符编码来解码字节(这可能与代码中使用的ascii编码不同)。
如果为universal_newlines=False,则for line in Robocopy.stdout:遍历b'\n'-separated行。如果进程使用非ascii编码,例如,UTF-16作为其输出,那么即使在您的系统上使用os.linesep == '\n',您也可能得到错误的结果。如果要使用文本行,请使用文本模式:传递universal_newlines=True或显式使用io.TextIOWrapper(process.stdout)。
第二个版本包含了universal_newlines,因此我指定了一个
。
通常,如果使用universal_newlines,则不需要指定bufsize (您可以指定,但不是必需的)。而且您不需要在本例中指定bufsize。bufsize=1启用行缓冲模式(如果要写入process.stdin,则在换行时自动刷新输入缓冲区),否则它等同于默认的bufsize=-1。
https://stackoverflow.com/questions/38181494
复制相似问题