首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用universal_newlines=True (带有bufsize=1)和使用默认参数打开有什么不同

使用universal_newlines=True (带有bufsize=1)和使用默认参数打开有什么不同
EN

Stack Overflow用户
提问于 2016-07-04 17:41:27
回答 1查看 16.2K关注 0票数 3

我正在尝试读取Python中名为的子进程的输出。为此,我使用了Popen (因为我不认为如果使用subprocess.call就不可能通过管道输出标准输出)。

到目前为止,我有两种方法,在测试中,似乎提供了相同的结果。代码如下:

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

代码语言:javascript
复制
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会使输出“行缓冲”,但我不确定这是什么意思。如果能解释一下这些不同的元素是如何联系在一起的,我会很感激的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 (您可以指定,但不是必需的)。而且您不需要在本例中指定bufsizebufsize=1启用行缓冲模式(如果要写入process.stdin,则在换行时自动刷新输入缓冲区),否则它等同于默认的bufsize=-1

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

https://stackoverflow.com/questions/38181494

复制
相关文章

相似问题

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