Подпроцесс Python. Открытое странное поведение - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь запустить процесс, и когда он закончится, прочитайте stderr и stdout. Я нашел единственный способ сделать это с помощью Python - создать подпроцесс.Popen с subprocess.PIPE в качестве аргументов stderr и stdout, а затем прочитать дескрипторы файлов Popen.stderr и Popen.stdout.

In [133]: subprocess.call(['python', '-c', "import sys; sys.exit(1)"])
Out[133]: 1

In [134]: p = subprocess.Popen(['python', '-c', "import sys; sys.exit(1)"])

In [135]: p.returncode

In [136]:

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

In [143]: p = subprocess.Popen(['python', '-c', "import sys; sys.stderr.write('ook'); sys.exit(1)"], stderr=subprocess.PIPE)

In [144]: p.stderr.read()
Out[144]: 'ook'

In [145]: p.returncode

In [146]: p.kill()

In [147]: p.returncode

In [148]: 

Таким образом, я могу прочитать stderr, что означает команду, которую я даю для подпроцесса. Открыт, но я не могу получить код возврата subprocess.Popen. Есть идеи?

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

Вы должны wait, чтобы завершить команду.

>>> p.wait()
1
>>> p.returncode
1

Или используйте communicate:

>>> stdout, stderr = p.communicate()
>>> stdout
>>> stderr
'ook'
>>> p.returncode
1
2 голосов
/ 05 марта 2012

попробуйте это:

In [39]: p = subprocess.Popen(['python', '-c', "import sys; sys.exit(1)"])

In [40]: p.poll()
Out[40]: 1
0 голосов
/ 05 марта 2012
if (subprocess.call(command, shell=True) != 0):
    # wait and return returncode attribute
    # non-zero returncode indicates failure
    pass 
...