Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么close_fds=False有时会挂起Python 2中的进程?_Python_Linux_Subprocess - Fatal编程技术网

为什么close_fds=False有时会挂起Python 2中的进程?

为什么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=

我注意到在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=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()有效关闭