我有以下代码
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有什么区别?
答案 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的行为不匹配。