Прежде всего, не используйте список для передачи аргументов для subprocess.Popen()
, если вы используете shell = True
!, измените команду на string
, "python test.py"
.
Popen.communicate(input=None, timeout=None)
- это метод класса блокировки, он должен взаимодействовать с процессом и ждать завершения процесса и устанавливать атрибут кода возврата.
, поскольку ваш test.py
работает бесконечно, пока l oop, он никогда не вернется!
у вас есть 2 варианта тайм-аута процесса proc
, который вы создали:
- назначьте аргумент ключевого слова тайм-аута в, например, времени процесс в течение 5 секунд,
communicate(timeout=5)
метод. Если процесс proc
не завершится через timeout
секунд, будет вызвано TimeoutExpired exception
. Перехват этого исключения и повторная попытка связи не приведет к потере вывода (в вашем случае дочерние выводы вам не нужны, но я упомяну об этом в примере ниже). ВНИМАНИЕ Дочерний процесс не уничтожается, если timeout expires
, поэтому для правильной очистки приложение с хорошим поведением должно убить дочерний процесс (proc
) и завершить sh обмен данными. - с помощью метода
poll
и синхронизация с помощью метода вызова.
связь с тайм-аутом
try:
outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
опрос с time.sleep
proc = subprocess.Popen('python test.py', shell=True)
t=10
while proc.poll() is None and t >= 0:
print('Still sleeping')
time.sleep(1)
t -= 1
proc.kill()