2016-07-20 3 views
2

Ich habe drei Skripte, die sich gegenseitig aufrufen. Sie sind die folgenden:Bash wartet auf einen Python-Subprozess

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") 

Leider ist das Skript1.sh eine Software von Drittanbietern und ich kann das nicht ändern.

Die script2.py starten das script3.py im Hintergrund und beenden. Es funktioniert gut von der Kommandozeile. Aber wenn das script1.sh das script2.py aufruft, das auf das script3.py wartet. So friert das Skript1.sh ein. Wie kann ich es vermeiden?

Antwort

3

Das Problem ist, dass script1.sh Capture Stdout und Python ist nicht fertig mit dem Schreiben auf Stdout, bis script3.py beendet.

Eine Lösung ist es, die stdout von script3.py woanders zu senden. Zum Beispiel ermöglicht dies script1.sh schnell abzuschließen:

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

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

Mit dieser Änderung script1.sh Ausgänge schnell und viel später child OK erscheint auf dem Terminal.