2016-07-20 9 views
2

私はお互いを呼び出す3つのスクリプトを持っています。BashはPythonのサブプロセスを待っています

script1.sh:

s=`./script2.py`; 
echo "DONE"; 

script2.py:

#!/usr/bin/env python3 
import subprocess 

subprocess.Popen(["./script3.py"]) 
print ("Exit script2") 

script3.py:

#!/usr/bin/env python3 
import time 

time.sleep(20) 
print ("child OK") 
彼らは次のようなものです

残念ながら、script1.shはサードパーティのソフトウェアであり、私はそれを変更することはできません。

script2.pyは、バックグラウンドでscript3.pyを起動して終了します。コマンドラインからうまく動作します。しかし、script1.shがscript3.pyを待っているscript2.pyを呼び出すと、したがって、script1.shはフリーズしています。どうすればそれを避けることができますか?

答えて

3

script1.shがstdoutをキャプチャしていて、script3.pyが終了するまで、pythonがstdoutへの書き込みを終了していないという問題があります。

解決策の1つはscript3.pyのstdoutを別の場所に送信することです。たとえば、これはscript1.shはすぐに完了することができます:すぐに、この変更により

$ cat script2.py 
#!/usr/bin/env python3 
import subprocess 
import sys 

subprocess.Popen(["./script3.py"], stdout=sys.stderr) 
print ("Exit script2") 

script1.sh終了をして、かなり後に、child OKが端末に表示されます。

関連する問題