2016-07-29 10 views
2

これがなぜ掛かっているのかを正確に理解できません。私は、この例をコアコンポーネントに取り上げました。私はファイルを持って、私はこのコマンドを実行した場合のそれdo_ls.py別個のプロセスグループでFabricコマンドを実行している場合

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それが正しく実行されます。今問題がある。私はそれを自分のプロセスで実行したいと思います。私はこのファイルを持っているので、私は永遠にハングしますpython main.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() 

を呼びましょう。問題は、私が知っている限り、サブグループ内でプロセスを実行しているということです(つまり、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が返されました。

問題はos.wait()subprocess.pyとうまく再生されないということである。その会話ごとに、(文書化されていない)_deadstate='dead'オプションでsp.Popen()を呼び出してみてください。 Popen.poll()Popen.wait()os.waitpid(pid, ...)を使用します。os.wait()によって既にpidが報告されている場合は、OSErrorを発生させます。 Popen.poll() OSErrorをスワイし、デフォルトではNoneを返します。

p.popen()の代わりに p.popen(_deadstate='dead')を使用してプログラムを修正(並べ替え)できます。これにより、OSErrorがキャッチされた場合、の代わりに poll() return 'dead'が生成されますが、この はドキュメント化されていません。

+0

Hey Ryan。応答していただきありがとうございます。私はまだ「働いている」例で投票を使用していますが、私は実行していたコマンドを単に置き換えました。申し訳ありませんが、その部分が混乱していた場合。だから私はこれが問題だとは思わない。私は、単に別のコマンドが働いていたと言っていました。再度、感謝します。 – loganasherjones

関連する問題