9

重複の可能性:
タイムアウトのあるサブプロセス

Pythonで次のことを行う最も簡単な方法は何ですか:

  • 外部プロセスを実行する
  • 文字列、stderr、および終了ステータスで stdout をキャプチャする
  • タイムアウトを設定します。

私はこのようなものが欲しいです:

import proc

try:
    status, stdout, stderr = proc.run(["ls", "-l"], timeout=10)
except proc.Timeout:
    print "failed"
4

2 に答える 2

13

私は自分でその仕事をするのが嫌いです。これを proc.py モジュールにコピーするだけです。

import subprocess
import time
import sys

class Timeout(Exception):
    pass

def run(command, timeout=10):
    proc = subprocess.Popen(command, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    poll_seconds = .250
    deadline = time.time()+timeout
    while time.time() < deadline and proc.poll() == None:
        time.sleep(poll_seconds)

    if proc.poll() == None:
        if float(sys.version[:3]) >= 2.6:
            proc.terminate()
        raise Timeout()

    stdout, stderr = proc.communicate()
    return stdout, stderr, proc.returncode

if __name__=="__main__":
    print run(["ls", "-l"])
    print run(["find", "/"], timeout=3) #should timeout
于 2009-10-12T19:52:23.957 に答える
12

coreutils >= 7.0 の Linux では、次のようにタイムアウトをコマンドの先頭に追加できます。

timeout 1 sleep 1000
于 2009-10-12T23:33:44.210 に答える