Popen.communicate () выдает OSError: «[Errno 10] Нет дочерних процессов» - PullRequest
9 голосов
/ 17 июня 2009

Я пытаюсь запустить дочерний процесс и получить его вывод на Linux из 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

Что может вызвать это исключение? Есть ли здесь какой-либо недетерминизм или расовые условия, которые могут вызвать вялость?

Ответы [ 4 ]

6 голосов
/ 01 октября 2010

Вы перехватываете SIGCHLD в сценарии? Если это так, Popen не будет работать так, как ожидалось, поскольку он полагается на свой собственный обработчик для этого сигнала.

Вы можете проверить обработчики SIGCHLD, закомментировав вызов Popen и выполнив:

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

Надеюсь, это поможет.

3 голосов
/ 18 июня 2009

Возможно, вы столкнулись с ошибкой, упомянутой здесь: http://bugs.python.org/issue1731717

0 голосов
/ 23 февраля 2010

Я столкнулся с этой проблемой, используя Python 2.6.4, который я встроил в свой домашний каталог (потому что я не хочу обновлять «встроенный» Python на машине).

Я обошел его, заменив subprocess.Popen() на (устарел) os.popen3().

0 голосов
/ 29 июля 2009

Я не могу воспроизвести это на моем Python (2.4.6-1ubuntu3). Как у вас работает скрипт? Как часто это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...