2015-04-02 27 views
1

我在Python中運行一種棘手的.exe文件來接收一些數據測量結果。文件應該打開,進行測量,然後關閉。這個問題有時會崩潰,我需要能夠在很長一段時間內每10分鐘進行一次這些測量。在Python腳本中殺死沒有響應的exe文件

我需要的是一個'檢查',看看.exe是否沒有響應,如果不是,然後讓它殺死進程。或者在每次測量之後殺死整個腳本。問題在於腳本在嘗試運行沒有響應的.exe文件時卡住了。

這裏的腳本:

FNULL = open(os.devnull, 'a') 

filename = "current_pressure.log" 

command = '"*SRH#\r"' 

args = "httpget -r -o " + filename + " -C 2 -S " + command + IP 

subprocess.call(args, stdout=FNULL, stderr=FNULL, shell=False) 

基本上,需要的東西,如:

"if httpget.exe not responding, then kill process" 

OR

"kill above script if running after longer than 20 seconds" 
+0

另一種更好的方式我會讀'httpget'文檔以找出是否有'deadline','timeout'選項。您可以在Python 3上使用'timeout'參數和'subprocess.call()'。 – jfs 2015-04-03 19:33:22

回答

0

使用計時器來殺死進程,如果它持續了太久。在這裏,我有兩個定時器來完成一個優雅的終結,但是如果你願意的話,你可以完成這個任務。

import threading 

FNULL = open(os.devnull, 'a') 
filename = "current_pressure.log" 
command = '"*SRH#\r"' 
args = "httpget -r -o " + filename + " -C 2 -S " + command + IP 

proc = subprocess.Popen(args, stdout=FNULL, stderr=FNULL, shell=False) 

nice = threading.Timer(20, proc.terminate) 
nice.start() 
mean = threading.Timer(22, proc.kill) 
mean.start() 
proc.wait() 
nice.cancel() 
mean.cancel() 
+0

太棒了!這似乎工作。如果我再有車禍,我會通知你。非常感謝! – 2015-04-03 18:59:02

+0

它仍然崩潰,我得到一個彈出窗口,顯示「httpget.exe已停止工作」,但現在程序能夠保持運行,即使這個打開,所以我猜這個問題已經解決了。只要它繼續運行,我不介意彈出式窗口。再次感謝! – 2015-04-03 19:08:54

+0

在Windows上,'kill()'是'terminate()'的別名。 'args'是一個字符串+'shell = False'就是Windows的意思。 – jfs 2015-04-03 19:31:57