2016-09-13 4 views
4
  child = subprocess.Popen(command, 
         shell=True, 
         env=environment, 
         close_fds=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT, 
         bufsize=1, 
            ) 

      subout = "" 
      with child.stdout: 
       for line in iter(child.stdout.readline, b''): 
        subout += line 
      logging.info(subout) 
      rc = child.wait() 

何度もこれは永遠にハングアップします。 それはそれを処理Popensし、そのプロセスはもはやpython subprocess.open hanging

私の推測では、child.stdout.readlineが起こっているように、それはBUFSIZEをどうしていることであるが存在するためiter(child.stdout.readline)またはchild.wait()

私はps -efでハングかどうかわかりません永遠に私はそれをテストする方法が分からないと、これは断続的に

を起こるように私は私は本当にpopen'dプロセスがちょうど遅いか

をぶら下げているかどうかを教えてくれカントとしてそれが適切かどうかわからない、アラームが、イムを実装することができしましょう子どもが何かを覚えているのですか?

答えて

5

あなたはおそらくexplained in the documentationだデッドロックを打っている:

Popen.wait()

子プロセスが終了するまで待ち。 returncode属性を設定して返します。

警告:stdout=PIPEおよび/またはstderr=PIPEを使用して、子プロセスがブロックは、より多くのデータを受け入れるようにOSパイプバッファを待っているようなパイプに十分な出力を生成するときにこれがデッドロックします。それを避けるにはcommunicate()を使用してください。

解決策は、Popen.communicate()を使用することです。

+0

ご連絡ありがとうございます! – ealeon

関連する問題