Есть ли способ передать параметр command timeout
для proc = subprocess.Popen(cmd.split(' '), stderr=subprocess.PIPE)
для завершения команд, которые зависают на неопределенный срок
import signal, os
import sys
import subprocess
import argparse
from subprocess import Popen, PIPE, STDOUT
import threading
from time import sleep
import time
from subprocess import Popen, PIPE, STDOUT
cmd = "python script.py -m loc"
proc = subprocess.Popen(cmd.split(' '), stderr=subprocess.PIPE)
print "Executing %s"%cmd
with proc.stderr:
for line in iter(proc.stderr.readline, b''):
print line,
print "process is done..." #doesn't print when command is hung
ОБНОВИТЬ:-
Я просмотрел следующие билеты, я не нашел четкого примера того, как использовать subprocess32
, я погуглил в документации по python, до сих пор не могу найти
timeout
. Для резервного копирования на Python 2 установите модульsubprocess32
. - person Corey Goldberg   schedule 01.07.2016subprocess32
или как мой текущий код изменится с его помощью? - person   schedule 01.07.2016In Python 3.3+:
, ищу конкретный пример на python 2.x(7) - person   schedule 01.07.2016for line in iter(proc.stderr.readline, b''):
? Файлоподобные объекты являются итерируемыми для своих собственных строк, вы можете просто выполнитьfor line in proc.stderr:
, и он будет вести себя так же, работать быстрее и быть более кратким для загрузки. - person ShadowRanger   schedule 01.07.2016subprocess32
, я погуглил в документации по python, но все еще не могу найтиhttp://stackoverflow.com/questions/3733270/python-subprocess-timeout
http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout
- person   schedule 01.07.2016subprocess32
- это просто модуль Python 3.2subprocess
, перенесенный обратно с добавленной функцией тайм-аута из 3.3. Прочтите документацию 3.3subprocess
для использования, вы просто устанавливаете и импортируетеsubprocess32
вместо импортsubprocess
. - person ShadowRanger   schedule 01.07.2016File "logger_output.py", line 14, in <module> proc = subprocess.Popen(cmd.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE,timeout=30) TypeError: __init__() got an unexpected keyword argument 'timeout'
, я добавилimport subprocess32 as subprocess from subprocess32 import Popen, PIPE, STDOUT
в свой код - person   schedule 01.07.2016Popen
принимаетtimeout
в качестве аргумента? Нет, это не так. ЧИТАЙТЕ ДОКУМЕНТЫ! - person ShadowRanger   schedule 01.07.2016select
для опроса дескриптора на наличие доступных данных и кодирования собственной логики для тайм-аута. В качестве альтернативы вы отправляетеstderr
в реальный файл (например,tempfile.TemporaryFile
) илиmultiprocessing.Process
выполняет чтение, в то время как основной потокwait
s в процессе сtimeout
и убивает подпроцесс, если он не завершается достаточно быстро. - person ShadowRanger   schedule 01.07.2016