【问题标题】:Popen.communicate() throws OSError: "[Errno 10] No child processes"Popen.communicate() 抛出 OSError: "[Errno 10] No child processes"
【发布时间】:2009-06-17 18:40:15
【问题描述】:

我正在尝试启动一个子进程并在 Linux 上使用 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

什么会导致这个异常?这里是否有任何可能导致片状的不确定性或竞争条件?

【问题讨论】:

  • 你用的是什么版本的python?如果我取出“extra_args”,它对我来说很好

标签: python linux


【解决方案1】:

您是否在脚本中拦截 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

希望对您有所帮助。

【讨论】:

  • bugs.python.org/issue9127 访问了该链接,但无法确定问题在哪个python 版本中得到修复。你能帮我做同样的事情吗?
  • 这里是解决这些问题的版本列表bugs.python.org/issue1731717#msg260457
  • 上面共享的消息和链接似乎不正确,因为根据提交错误的版本 Python 3.1、Python 3.2、Python 2.7、Python 2.6 提到了这些 Python 版本发现错误的位置。
【解决方案2】:

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

【讨论】:

  • 如果是这个错误,请考虑将您的 python 更新到 2.5/2.6。已经解决了。
  • 截至 2010 年 9 月 29 日,该错误仍被标记为“打开/需要补丁”并影响版本 3.2、3.1、2.7、2.6。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    我通过将subprocess.Popen() 替换为(已弃用的)os.popen3() 来解决它。

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 2020-10-27
      • 1970-01-01
      • 2015-06-15
      • 2023-03-28
      • 2016-06-07
      • 2017-07-05
      • 2018-11-20
      • 2018-07-24
      相关资源
      最近更新 更多