2015-04-27 2 views
2

Я написал сценарий python, который отвечает за выполнение других скриптов. Я замечаю, что время от времени я получаю несуществующий процесс.Обнаружение, если процесс завершает работу с подпроцессом Python

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

Единственное, с чем я сейчас сталкиваюсь, это то, что мне также нужно получить код выхода процесса.

Мой код ниже.

job.append("py") 
job.append("\tmp\test\sleep.py") 
job.append("20") 
p = subprocess.Popen(job, stderr=subprocess.PIPE,stdout=subprocess.PIPE) 
exit_code_main = p.wait() 

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

+3

_ "Я был чтение некоторых других потоков на StackOverFlow ... »_ Я тоже хотел бы прочитать их. Есть ли ссылки? – Kevin

+1

вы можете получить код выхода из 'p'' print p.returncode' –

+0

@Kevin http://stackoverflow.com/questions/2760652/how-to-kill-or-avoid-zombie-processes-with-subprocess- модуль – user3012759

ответ

2

Вот пример того, как захватить стандартные вывод, STDERR и коды выхода с subprocess:

p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    stdout, stderr = p.communicate() 

    logger.info("Executed notification script %s, exit code %d", args, p.returncode) 
    logger.info("stdout: %s", stdout) 
    logger.info("stderr: %s", stderr) 

    if p.returncode != 0: 
     raise RuntimeError("The script did not exit cleanly: {}".format(args)) 
1

Вы можете использовать check_output поймать какой-либо статус ненулевой выходы:

from subprocess import check_output, CalledProcessError 
try: 
    out = check_output(job) 
except CalledProcessError as e: 
    print(e.returncode) 
    print(e.message) 
else: 
    print(out)