subprocess.Popen не выполняет все строки сценария оболочки

1

код:

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. Если я изменил порядок скриптов, то последний из них не будет выполнен.

  • 0
    Мне удалось определить проблему, мне не удалось закрыть файл после написания последнего сценария декодера. Таким образом, подпроцесс пытался запустить скрипт до того, как он был полностью написан.
Теги:
subprocess

1 ответ

2
Лучший ответ

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

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

Посмотрев на ваш обновленный скрипт, ошибка почти наверняка будет в сценариях, которые вы оцениваете. Например, они могут просто закончиться временными файлами или другими непреднамеренно общими ресурсами. Пожалуйста, decoder__ скрипты 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.

  • 0
    Я попытался уменьшить количество сценариев decoder__, чтобы проверить, является ли это проблемой с ресурсами, но даже при уменьшенном количестве сценариев последний сценарий всегда не выполняется. Пример сценария декодера__ выглядит следующим образом: cd /export/Experiments/hierMultiStream_audSpec_direct/decoder__10 sh decoder.sh eval > /export/Experiments /hierMultiStream_audSpec_direct/tempScripts/n_10.out Сомнение, если это проблема скриптов декодера__, как я указал до этого при изменении порядка скриптов они работают нормально, за исключением текущего последнего скрипта.
  • 0
    При запуске с / bin / echo в начале команды он печатает все сценарии decoder__, включая последний.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню