2011-03-31 50 views
1

當我運行下面的代碼:的Python:調用process.terminate()不殺它

p = subprocess.Popen("...", shell=True)   
if p.poll() == None: 
    p.kill() 

過程根本就沒有殺害。我在Windows上。

我以爲是因爲多線程,我在單線程中運行它,仍然是同樣的事情。

你有什麼想法,爲什麼會發生這種情況?

感謝

更新

我發現導致問題的代碼:

while cur_time < self.time_limit: 
      if p.poll() != None: 
       too_much_time = False 
       break 
      time.sleep(0.1) 
      cur_time += 0.1 

我跑這來確保該過程不會超過時限更多。顯然這就是爲什麼我不能殺死這個過程。

+0

@nmichaels,我都試過。兩者都不起作用。根據文檔,他們在Windows上也做了同樣的事情。 – Alex 2011-03-31 18:52:20

+0

你的意思是什麼「我不能殺死進程」:循環在任何地方都不包含'p.kill()',並且你說有一個單獨的線程。在循環中打印'cur_time,self.time_limit'。 – jfs 2011-03-31 19:34:39

+1

除非在shell命令(如'type')中執行內置命令,否則不需要'shell = True'。 'None'是一個單身人士;你可以在循環中使用'p.poll()不是None'。 – jfs 2011-03-31 19:37:15

回答

2

因爲你使用任何shell=True一個腳本,你最終會殺殼( cmd.exe進程)本身。

進程組是Windows的一個相對較新的功能,除了Task Scheduler之外,我還不知道有哪些軟件實際上使用它們。

+0

非常感謝!的確,這就是原因。我甚至沒有考慮shell參數。爲什麼我甚至使用它? – Alex 2011-04-01 05:43:27

0

可能是因爲您正在運行的命令是將sigmask設置爲忽略kill信號。你可以嘗試使用另一個命令嗎?例如,作出這樣的睡在一個無限的同時,試圖殺死

offtopic,我覺得殼ARG並不意味着在Windows

+0

我運行循環,直到程序停止。如果它在n秒內沒有停止,我就殺了它。問題是它不想被殺死。 – Alex 2011-03-31 19:17:52

+0

對;我試圖downvote我的答案,但它不工作:)這可能是你正在運行的命令是設置sigmask忽略kill信號。你可以嘗試使用另一個命令嗎?例如製作一個無限期睡眠的腳本,並試圖殺死它 – user237419 2011-03-31 19:27:44