subprocess.Popen не выполняет все строки сценария оболочки - PullRequest
1 голос
/ 27 января 2012

код:

proc=subprocess.Popen(['sh',shFile],stderr=subprocess.PIPE,stdout=subprocess.PIPE)

out,err = proc.communicate()

Проблема:

shFile в строке 1 запускает несколько сценариев оболочки.Когда я запускаю shFile из bash, выполняются все сценарии оболочки.Однако, когда я выполняю его с помощью subprocess.Popen, последний сценарий оболочки не выполняется.Интересно, что последняя строка shFile - "echo 'Done'", которая выполняется.

Последние 6 строк shFile:

sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__5_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__15_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__10_eval.sh
echo "Done"

Только декодер__10_eval.sh не выполняется.Если я изменю порядок сценариев, последний раз снова не будет выполнен.

1 Ответ

2 голосов
/ 27 января 2012

подпроцесс не делает никакой магии. Обратите внимание, что sh часто не bash в современных системах Linux, а облегченная оболочка, такая как dash. Если ваш сценарий оболочки специфичен для bash, вам нужно изменить 'sh' на 'bash'.

В любом случае крайне маловероятно (менее вероятно, чем выигрыш в лотерею десять раз подряд), что sh (или bash) "забудут" выполнить строку в скрипт. Также убедитесь, что shFile - это то, что вы ожидаете.

Глядя на ваш обновленный скрипт, ошибка почти наверняка в скриптах, которые вы оцениваете. Например, они могут просто исчерпать временные файлы или другие непреднамеренно общие ресурсы. Пожалуйста, опубликуйте сценарии decoder__ или воспроизведите проблему с shFile, содержащим:

/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__5_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__15_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__10_eval.sh
echo "Done"

Если вывод «10» отсутствует, значит, у вас действительно проблема с sh. В противном случае (и опять же, с очень высокой достоверностью) проблема заключается в выполняемых вами сценариях tempScripts.

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