как обрабатывать команды, которые зависают на неопределенный срок

Есть ли способ передать параметр 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, до сих пор не могу найти

Время ожидания подпроцесса Python?

Использование модуля "подпроцесс" с тайм-аутом


person Community    schedule 01.07.2016    source источник
comment
Python 3.3+ поддерживает аргумент timeout. Для резервного копирования на Python 2 установите модуль subprocess32.   -  person Corey Goldberg    schedule 01.07.2016
comment
Кори. Могу ли я получить пример того, как использовать subprocess32 или как мой текущий код изменится с его помощью?   -  person    schedule 01.07.2016
comment
Вот вопрос, касающийся тайм-аута: Использование модуля "подпроцесс" с тайм-аутом   -  person xgord    schedule 01.07.2016
comment
Я его уже посмотрел, он в In Python 3.3+:, ищу конкретный пример на python 2.x(7)   -  person    schedule 01.07.2016
comment
Примечание: Почему вы делаете for line in iter(proc.stderr.readline, b''):? Файлоподобные объекты являются итерируемыми для своих собственных строк, вы можете просто выполнить for line in proc.stderr:, и он будет вести себя так же, работать быстрее и быть более кратким для загрузки.   -  person ShadowRanger    schedule 01.07.2016
comment
@ShadowRanger - я просмотрел следующие билеты, я не нашел четкого примера того, как использовать subprocess32, я погуглил в документации по python, но все еще не могу найти http://stackoverflow.com/questions/3733270/python-subprocess-timeout http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout   -  person    schedule 01.07.2016
comment
@user3682248: user3682248: subprocess32 - это просто модуль Python 3.2 subprocess, перенесенный обратно с добавленной функцией тайм-аута из 3.3. Прочтите документацию 3.3 subprocess для использования, вы просто устанавливаете и импортируете subprocess32 вместо импорт subprocess.   -  person ShadowRanger    schedule 01.07.2016
comment
@ShadowRanger - я сделал это и получил ошибку File "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.2016
comment
@ user3682248: Вы не читали документы. Шутки в сторону. Прочитайте документы, которые я только что связал с вами. Они говорят, что Popen принимает timeout в качестве аргумента? Нет, это не так. ЧИТАЙТЕ ДОКУМЕНТЫ!   -  person ShadowRanger    schedule 01.07.2016
comment
@ user3682248: отмечу, что в этом случае идентифицировать зависшие команды сложно, потому что вы блокируете чтение из выходного канала, и это действие блокировки не может быть рассчитано по времени (не связано с подпроцессом). Вам нужно установить тайм-аут самостоятельно, используя примитивы модуля select для опроса дескриптора на наличие доступных данных и кодирования собственной логики для тайм-аута. В качестве альтернативы вы отправляете stderr в реальный файл (например, tempfile.TemporaryFile) или multiprocessing.Process выполняет чтение, в то время как основной поток waits в процессе с timeout и убивает подпроцесс, если он не завершается достаточно быстро.   -  person ShadowRanger    schedule 01.07.2016