2015-10-17 44 views
0

因此,我通過一個目錄運行一個循環,其中由subprocess.Popen運行的外部腳本正在移動目錄並對每個文件執行計算。外部腳本有點不穩定,偶爾會在運行到不知道如何處理的文件中時凍結。有沒有辦法給subprocess.Popen添加一個超時函數,這樣我就可以跳過那個文件並轉到下一個?在Python中循環期間設置超時?

編輯: 這裏是我的循環:

def automate(): 
    os.chdir("/home/mlts/dir") 
    working_dir = b"/home/mts/dir" 
    for filename in os.listdir(working_dir): 
     if filename.endswith(".MTS"): 
      try: 
       print("Performing calculations on {filename!r}...".format(**vars())) 
       try: 
        os.remove("mts_tbl.txt") 
       except OSError: 
        pass 
       time.sleep(3) 
       p = Popen(["run_command.command", "-f", "a"], cwd=working_dir, stdin=PIPE) 
       p.communicate(input=b"\n".join([b"1", str(filename), b"8", b"alloy-liquid", b"0", b"x", b"5", b"4", b"-1.6", b"4", b"1", b"0"])) 
+0

人們可以幫你超過超時部分,但跳過文件腳本凍結,你必須提供代碼 – MohitC

+0

明白了。提供編輯... – Scott

+0

您缺少os.chdir行上的最後一行 –

回答

0

要強制timeout關於Python 2(其中.communicate(timeout=)不STDLIB存在),你可以使用threading.Timer()

p = Popen(...) 
t = Timer(3, p.kill) # kill in 3 seconds 
t.start() 
p.communicate(...) 
t.cancel() # no need to kill, the process is dead already 

完整的例子:

import os 
import traceback 
from glob import glob 
from subprocess import Popen, PIPE 
from threading import Timer 

os.chdir("/home/mls/dir") #XXX assume mlts is a typo in the question 
for filename in glob(b"*.MTS"): 
    print("Performing calculations on {filename!r}...".format(**vars())) 
    try: 
     os.remove("mts_tbl.txt") 
    except OSError: 
     pass # ignore 
    try: 
     p = Popen(["run_command.command", "-f", "a"], stdin=PIPE) #XXX no cwd 
     t = Timer(3, p.kill) 
     t.start() 
     p.communicate(input=b"\n".join([b"1", filename, 
       b"8\nalloy-liquid\n0\nx\n5\n4\n-1.6\n4\n1\n0"])) 
     t.cancel() 
    except Exception: 
     traceback.print_exc() 

此代碼假定您要在父Python腳本的當前工作目錄中運行子進程。

在Python 3上或者如果安裝了subprocess32;您可以將timeout參數傳遞給.communicate()方法,而不是使用Timer()

+0

似乎已經做了伎倆......謝謝! – Scott