Вам нужно установить дескрипторы файлов как неблокирующие, вы можете сделать это, используя fcntl :
import sys, time, fcntl, os
from subprocess import *
chldp = Popen(sys.argv[1], bufsize=0, stdout=PIPE, close_fds=True)
chstdin, chstdout = chldp.stdin, chldp.stdout
fl = fcntl.fcntl(chstdout, fcntl.F_GETFL)
fcntl.fcntl(chstdout, fcntl.F_SETFL, fl | os.O_NONBLOCK)
while chldp.poll() is not None:
try:
rrl = chstdout.readline()
except IOError:
time.sleep(0.1)
continue
# use rrl
Когда нет доступных данных, IOError
будетподнят на readline()
.
Обратите внимание, что, поскольку chldp.poll()
может вернуть 0
по завершении подпроцесса, вам, вероятно, следует использовать childp.poll() is not None
в вашем while
вместо not childp.poll()
.