python 2.7和3.3子进程模块的区别

时间:2013-12-13 11:08:08

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

我有以下代码

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,当我尝试写入stdin时会抛出异常。使用python 3.3,这段代码打印出4. python 2.7子进程模块和python 3.3有什么区别?

1 个答案:

答案 0 :(得分:6)

差异在于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的行为不匹配。