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上出现异常?