python 2.7和3.3子流程模块的差异

python 2.7和3.3子流程模块的差异,python,python-2.7,python-3.x,subprocess,python-3.3,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')) 我用Python2.7和Python3.3运行了它。在Python2.7中,当我尝试写入stdin时会引发异常。对于Py

我有以下代码

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'))

我用Python2.7和Python3.3运行了它。在Python2.7中,当我尝试写入stdin时会引发异常。对于Python3.3,这段代码输出4。python 2.7子流程模块和python 3.3之间有什么区别?

区别在于
bufsize
的默认值。在Python2.7中它是
0
(无缓冲),因此
write
会导致
EPIPE
错误。管道在Python3.2+中被完全缓冲,也就是说,在刷新缓冲区之前,不会检测到任何错误。发件人:

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


Docs for and warn使用
通信而不是
.stdin.write
-这有什么区别吗?最好知道Python 2.7:-)中抛出了哪个表达式。异常是
IOError:[Errno 32]断管
。当我使用
communicate
时,不会引发异常,但我需要使用
stdin.write
。为什么要先终止进程,然后再写入它的stdin?在我看来,这只是一种未定义的行为。你到底想做什么?要优雅地处理子进程死亡的情况?在哪个站台?如果在最后添加
p.stdin.flush()
,是否会在3.3上出现异常?