2016-07-29 83 views
2

我無法準確理解掛起的原因。我已將這個例子分解爲核心組件。我有一個文件,姑且稱之爲do_ls.py在單獨進程組掛起中運行結構命令

import fabric.api 
import time 

host = "myhost.mydomain" 
username = "username" 
password = "password" 

def main(): 
    with fabric.api.settings(host_string=host,user=username,password=password): 
     result = fabric.api.run("ls") 

if __name__ == "__main__": 
    main() 

如果我運行此命令:python do_ls.py它會正確執行。現在解決問題。我想在它自己的過程中運行它。所以我有這個文件,我們稱之爲main.py

import sys 
import os 
import logging 
import subprocess as sp 
import time 

def main(): 
    logging.basicConfig(level=logging.DEBUG) 
    cmd = [sys.executable, "/path/to/do_ls.py"] 
    p = sp.Popen(cmd, preexec_fn=os.setpgrp) 
    while p.poll() is None: 
     print "Sleeping..." 
     time.sleep(0.5) 
    print "All Done." 

if __name__ == "__main__": 
    main() 

現在,如果我跑python main.py這將永遠掛起。據我所知,問題在於我在一個子組中運行該過程(即,如果我取出preexec_fn=os.setpgrp,那麼它將正常工作)。我不明白的是,爲什麼會出現這種情況。特別是鑑於以下工作:

cmd = ["ssh", "-q", "[email protected]", "ls"] 
    p = sp.Popen(cmd, preexec_fn=os.setpgrp) 

任何有識之士將不勝感激。

回答

1

由於以下行的工作:

cmd = ["ssh", "-q", "[email protected]", "ls"] 
p = sp.Popen(cmd, preexec_fn=os.setpgrp) 

main.py不斷掛,我認爲

while p.poll() is None: 

從不計算False。因此p.poll()必須始終返回None,甚至可能在該過程完成之後。快速搜索在Python的錯誤報告網站上返回this conversation。按照那次談話,嘗試調用sp.Popen()與(無證)_deadstate='dead'選項:

的問題是,os.wait()subprocess.py發揮很好。 Popen.poll()Popen.wait()使用os.waitpid(pid, ...)這將 如果pid已被os.wait()報告,則引發OSError。 Popen.poll()吞下OSError並默認返回無。

你可以通過使用 p.popen(_deadstate='dead')來代替p.popen()來修復你的程序。如果OSError被捕獲,這將使 poll()返回'dead'而不是None,但是這個 未被記錄。

+0

嘿瑞恩。感謝您的迴應。在「工作」示例中,我仍然使用poll,我只是替換了我正在執行的命令。對不起,如果那部分是混亂。所以我不認爲這是問題。我只是說,一個不同的命令正在工作。再次感謝。 – loganasherjones

相關問題