2009-06-17 57 views
8

我试图启动一个子进程,并使用该子模块在Python获取其在Linux上输出:Popen.communicate()抛出OSERROR:“[错误10]没有子进程”

#!/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 

什么会导致此异常?这里有任何非决定论或竞赛条件可能导致片状吗?

+0

你使用的是什么版本的python?它适用于我,如果我拿出'extra_args' – sqram 2009-06-17 18:45:05

回答

3

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

+1

如果是这个bug考虑更新您的python到2.5/2.6。它已经解决。 – kjfletch 2009-07-09 06:52:38

+2

截至2010年9月29日,该错误仍被标记为“打开/需要修补程序”,并影响版本3.2,3.1,2.7,2.6。 – fotinakis 2010-09-29 21:14:03

0

我不能重现这个对我的Python(2.4.6-1ubuntu3)。你如何运行你的脚本?这种情况发生的频率如何?

0

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

我通过用(已弃用的)os.popen3()替代subprocess.Popen()解决了这个问题。

6

你在拦截脚本中的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) 

有报道这样的蟒蛇错误,据我看到它尚未解决:

http://bugs.python.org/issue9127

希望有所帮助。