2009-10-12 49 views
8

可能重複:
subprocess with timeout蟒蛇:運行一個進程,超時和捕獲標準輸出,標準錯誤和退出狀態

什麼是做在Python以下最簡單的方法:

  • 運行外部進程
  • 捕獲字符串stderr中的stdout和退出狀態
  • 設置超時。

我想是這樣的:

import proc 

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

只是讓我們知道你是從開始,您曾經考慮過'subprocess'模塊? http://docs.python.org/library/subprocess.html – 2009-10-12 19:11:58

+0

不 - 看起來像是一個巨大的飛躍 – flybywire 2009-10-12 19:15:38

+1

子進程'Popen.communicate超時,類似的問題:http://stackoverflow.com/questions/1191374/子進程超時 – Mark 2009-10-12 19:15:45

回答

12

我討厭我自己做的工作。只需將其複製到您的proc.py模塊中即可。與Linux的coreutils的

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 
+1

由於管道緩衝區溢出(stdout或stderr〜64K),此版本可能會超時。 – jfs 2009-10-12 22:19:27

+1

如果該命令超時,則不會在超時時間內生成任何輸出。 – 2009-10-13 01:57:10

+0

print run([「ping www.redicecn.com」],timeout = 10),腳本拋出Timeout異常,但ping進程仍在運行。 – redice 2012-09-06 12:33:27

11

注> = 7.0,你可以在前面加上超時像命令:

timeout 1 sleep 1000 
相關問題