8

Вопрос по linux, python – Popen.communicate () выдает OSError: «[Errno 10] Нет дочерних процессов»

Я пытаюсь запустить дочерний процесс и получить его вывод на Linux из Python с помощью модуля подпроцесса: #!/usr/bin/python2.4 import subprocess p = subprocess.Popen(['ls', '-l', '/etc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err ...

Какую версию Python вы используете? Это хорошо работает для меня, если я достану «extra_args»

от sqram

4 ответа

0

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

0

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

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

6

Вы перехватываете 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

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

Похожие вопросы