【问题标题】:python 2.7 and 3.3 subprocess module differencepython 2.7和3.3子进程模块区别
【发布时间】:2014-01-01 03:14:00
【问题描述】:

我有以下代码

from __future__ import print_function
import subprocess

p = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.kill()
p.wait()
print(p.stdin.write(b'some'))

我使用 python 2.7 和 python 3.3 运行它。使用 python 2.7 时,当我尝试写入标准输入时会引发异常。使用 python 3.3 此代码打印 4。python 2.7 子进程模块和 python 3.3 有什么区别?

【问题讨论】:

  • 2.73.3 的文档警告使用 communicate 而不是 .stdin.write - 这有什么不同吗?
  • 很高兴知道 Python 2.7 中抛出了哪个表达式 :-)
  • 例外是IOError: [Errno 32] Broken pipe。当我使用communicate 时不会抛出异常,但我需要使用stdin.write
  • 你为什么要先杀死进程然后写入它的标准输入?对我来说,这似乎只是未定义的行为。
  • 你真正想做什么?优雅地处理子进程死亡的情况?在哪个平台上?如果最后添加p.stdin.flush(),3.3 会出现异常吗?

标签: python python-2.7 python-3.x subprocess python-3.3


【解决方案1】:

区别在于bufsize 的默认值。它在 Python 2.7 中是 0(无缓冲),因此 write 会导致 EPIPE 错误。在 Python 3.2+ 中,管道是完全缓冲的,也就是说,在刷新缓冲区之前,不会检测到错误。来自subprocess' docs

在 3.3.1 版中更改:bufsize 现在默认为 -1 以启用 默认情况下缓冲以匹配大多数代码所期望的行为。在 Python 3.2.4 和 3.3.1 之前的版本错误地默认为 0 这是无缓冲的,允许短读。这是无意的 并且与大多数代码预期的 Python 2 的行为不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2018-02-11
    • 2013-12-23
    • 2014-03-30
    • 2017-05-30
    • 2016-06-30
    • 2017-06-19
    相关资源
    最近更新 更多