В приведенном ниже коде p.returncode
всегда None
. Согласно Popen.returncode
документации, это означает, что процесс еще не завершен.
Почему я не получаю код выхода?
import os
import sys
import subprocess
cmd = ['echo','hello']
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
try:
# Filter stdout
for line in iter(p.stdout.readline, ''):
sys.stdout.flush()
# Print status
print(">>> " + line.rstrip())
sys.stdout.flush()
except:
sys.stdout.flush()
print 'RETURN CODE', p.returncode
Обратите внимание: причина, по которой я читаю каждую строку отдельно, заключается в том, что я хочу фильтровать выходные данные других длительных процессов в режиме реального времени и останавливать их на основе определенных строк.
Я на Python 2.7.5 (CentOS 7 64-бит).
Решение
Благодаря ответу, отправленному @skyking, теперь я могу успешно захватить код выхода следующим образом: Popen.poll()
(Popen.wait()
заблокировал мой процесс):
import os
import sys
import subprocess
import time
cmd = ['echo','hello']
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
try:
# Filter stdout
for line in iter(p.stdout.readline, ''):
sys.stdout.flush()
# Print status
print(">>> " + line.rstrip())
sys.stdout.flush()
except:
sys.stdout.flush()
# Wait until process terminates (without using p.wait())
while p.poll() is None:
# Process hasn't exited yet, let wait some
time.sleep(0.5)
# Get return code from process
return_code = p.returncode
print 'RETURN CODE', return_code
# Exit with return code from process
sys.exit(return_code)