Popen.communicate()抛出OSError:“没有subprocess”

我正在尝试启动subprocess,并使用subprocess模块从Python获取其输出:

#!/usr/bin/python2.4 import subprocess p = subprocess.Popen(['ls', '-l', '/etc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() 

但是,我经历了一些片面性:有时,p.communicate()会抛出

 OSError: [Errno 10] No child processes 

什么会导致这个exception? 这里有什么非决定论或竞赛条件可能会导致片状?

Solutions Collecting From Web of "Popen.communicate()抛出OSError:“没有subprocess”"

你在拦截脚本中的SIGCHLD吗? 如果你是那么Popen将不会按预期运行,因为它依靠它自己的信号处理程序。

您可以通过注释Popen调用然后运行来检查SIGCHLD处理程序:

 strace python <your_script.py> | grep SIGCHLD 

如果你看到类似的东西:

 rt_sigaction(SIGCHLD, ...) 

那么,你有麻烦了。 你需要在调用Popen之前禁用处理程序,然后在通信完成后重置它(这可能会引入竞争条件,所以要小心)。

 signal.signal(SIGCHLD, handler) ... signal.signal(SIGCHLD, signal.SIG_DFL) ''' now you can go wild with Popen. WARNING!!! during this time no signals will be delivered to handler ''' ... signal.signal(SIGCHLD, handler) 

有一个python的错误报告,据我所知,它还没有得到解决:

http://bugs.python.org/issue9127

希望有所帮助。

您可能会遇到这里提到的错误: http : //bugs.python.org/issue1731717

我无法在Python(2.4.6-1ubuntu3)上重现这一点。 你如何运行你的脚本? 这种情况多久发生一次?

我遇到了这个问题使用Python 2.6.4,我建立到我的主目录(因为我不想升级在机器上的“内置”的Python)。

我通过用(不赞成的) os.popen3()替换os.popen3()