为什么close_fds=False有时会挂起Python 2中的进程?
我注意到在Python3子进程中,Popen参数为什么close_fds=False有时会挂起Python 2中的进程?,python,linux,subprocess,Python,Linux,Subprocess,我注意到在Python3子进程中,Popen参数close\u fds的默认值从False更改为True,我想知道的原因是什么,以及几乎总是将close\u fds设置为True是否是一种好的做法(因为我仍在使用Python 2.7) 我发现一个链接显示了close\u fds=False的问题 不幸的是,我不清楚为什么会这样 将子流程作为子流程导入 p1=sub.Popen(['cat'],stdin=sub.PIPE,stdout=sub.PIPE,close_fds=False) p2=
close\u fds
的默认值从False
更改为True
,我想知道的原因是什么,以及几乎总是将close\u fds
设置为True
是否是一种好的做法(因为我仍在使用Python 2.7)
我发现一个链接显示了close\u fds=False
的问题
不幸的是,我不清楚为什么会这样
将子流程作为子流程导入
p1=sub.Popen(['cat'],stdin=sub.PIPE,stdout=sub.PIPE,close_fds=False)
p2=sub.Popen(['grep','a'],stdin=p1.stdout,stdout=sub.PIPE,close\u fds=False)
p1.stdin.write(“aaaaaaaaaaaaaaaa\n”)
p1.标准关闭()
p2.stdout.read()挂起在Python 2上
如果close\u fds
设置为True
,程序将挂起在Python2上,而不挂起在Python3上,并且根本不会挂起。因此,我想知道……实际的问题是什么
编辑:它在我的Python 2.6上挂起,在2.7上停止挂起
那里的实际问题是什么
在Python2.6中,p1.stdin
管道的写入端的文件句柄由p2
继承,p2不关心或不知道它,因此使它保持打开状态,写入管道保持打开状态,因此,cat
不会在其输入上检测到EOF,并一直等待来自管道的数据,从而阻塞整个流程链
在Python 2.7中,对的调用遵循stdin
和stdout
管道的创建,这样写入管道端就不会被p2
继承,而是被p1.stdin.close()有效关闭