2012-05-29 2 views
2

Использование Python 3.2, и следующий фрагмент кода:питон подпроцесс общаться зависания вызова сценарий оболочки

p = subprocess.Popen(['../start_server.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out,err = p.communicate() 

if out != None : 
    out = out.decode('utf-8') 
if err != None : 
    err = err.decode('utf-8') 

print('out ',out) 
print('err ',err) 

на некоторых сценариях оболочки, она работает просто отлично, и я получу свой выход. на других он просто висит. но в каждом случае сценарий оболочки запускается из командной строки без ошибок. Единственная общность, которую я вижу, - это (обычно) те, которые висят, имеют нулевой выход. Когда материал выходит из строя, проверяет запущенные процессы, и я вижу мой сценарий оболочки не указан в список и сценарий питона все еще работает

Что надежный способ вызвать скрипт и контроль всегда вернуться к моему питону программе?


Edit:

Использование труб Popen и такое не является обязательным требованием, единственным требованием является то, что управление возвращается в мой питон скрипт при выходе из сценария оболочки. Если сценарий оболочки никогда не возвращается в командную строку, мой сценарий python также никогда не вернется.

Так что, предполагая, что сценарий оболочки, который я вызываю, всегда возвращается в командную строку, как я могу получить контроль над моей программой python?
Если Theres лучший способ, что ивы перечисленные выше - пожалуйста, просветите меня

один дополнительный бит ив обнаружил, сценарии оболочки, которые «висит», кажется, заканчивается вызовом «поЬира» Ye они возвращаются к команде без проблем.

+0

Это может быть что-то, что делает ваш скрипт (порождение другого процесса)? – jdigital

+0

Мой фрагмент кода вызывает множество сценариев оболочки. Все они либо запускают новый процесс, либо останавливают существующий процесс. Некоторые работы, а некоторые нет. Но во всех случаях сценарии оболочки отлично работают из командной строки, не производят ошибок и делают то, что они должны. Я пытаюсь автоматизировать вызов существующих сценариев производства, поэтому внесение изменений в них не может быть и речи. – Jon

+0

Я не предлагал, чтобы вы что-то меняли, я давал вам подсказку, что-то искать, что могло бы помочь вам определить причину проблемы. – jdigital

ответ

0

Какой надежный способ вызвать скрипт оболочки и всегда возвращать управление в мою программу python?

Если вы используете трубы, это будет зависеть от ваших сценариев; более общий ответ - это, по сути, halting problem, и даже могучий StackOverflow не может вам этого помочь.

Я бы посоветовал вам углубиться и попытаться создать воспроизводимый футляр, чтобы мы могли помочь вам решить конкретную проблему, которую вы видите.

Редактировать

Если вам не нужны трубы, то просто опускаем STDOUT и STDERR параметры (или установить их на что-то другое, чем PIPE). См. python subprocess management.

+1

хорошо, если сценарий оболочки никогда не возвращается в командную строку, я ожидал бы, что мой скрипт python будет делать то же самое. но это не так. Все сценарии оболочки вернутся в командную строку, когда они будут выполнены. – Jon

+1

Программы могут изменять свое поведение, если stdin и stdout подключены к каналам, а не к консоли (tty); наиболее заметно, что поведение буферизации изменяется, но может быть и другими вещами, которые различны.Поэтому ситуация, о которой вы рассказываете, не удивительно. – jdigital