2016-11-08 18 views
0

私はバックグラウンドオプション&でプロセスを開始しているシェルスクリプトを実行しています。シェルスクリプトは、Pythonスクリプトから呼び出され、ハングします。サブプロセスpopen Python

シェルスクリプト:

test -f filename -d & 

のpythonファイル

cmd =["shellscript","restart"] 
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, stdin=subprocess.PIPE, **kwargs) 
pid = proc.pid 
out, err = proc.communicate() 
returncode = proc.poll() 

Pythonのファイルがハングし、それはPythonのプロセスから戻りません。また、pythonプロセスは自動化されたものです。

+0

"cmd"とは何ですか? – Hannu

+0

cmdはリスト[ restart]以外の何ものでもありません。 – Shriram

+1

'test -f filename -d&'は有効なコマンドのようには見えません。少なくとも 'test'が標準のposixテストバイナリまたはシェル組み込みコマンドである場合は、少なくともです。これは単なる他のもののプレースホルダですか? – mata

答えて

0

コンマは、あなたのcmdリストにありません:

cmd =["shellscript", "restart"] 
+0

すみません、私の間違いです。しかし、シェルスクリプトは、pythonによって開始されるバックグラウンドとしてオプションを持つプロセスを開始します。 – Shriram

1

stderrstdoutに使用パイプが閉じられるまでproc.communicate()への呼び出しはブロックされます。シェルスクリプトがこれらのパイプを継承する子プロセスを生成する場合、そのプロセスがパイプの書き込み終了を閉じた後に終了するか、または終了します。
subprocess_to_start >/dev/null 2>&1 &

  • stderrために使用subprocess.DEVNULLまたは開かれたファイルオブジェクト:あなたは

    • は、例えば、/dev/nullに開始したサブプロセスの出力したり、シェルスクリプトでログファイルをリダイレクトするか、この問題を解決するには

      あなたのpythonスクリプトにstdoutを入れて、communicate()呼び出しをドロップします。

  • 関連する問題