Bash 正在等待 python 子进程
Bash is waiting for a python subprocess
我有三个相互调用的脚本。它们是:
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 冻结了。我怎样才能避免它?
问题是 script1.sh
正在捕获标准输出,而 python 在 script3.py
完成之前尚未完成对标准输出的写入。
一个解决方案是将 script3.py
的标准输出发送到其他地方。例如,这允许 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
会出现在终端上。
我有三个相互调用的脚本。它们是:
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 冻结了。我怎样才能避免它?
问题是 script1.sh
正在捕获标准输出,而 python 在 script3.py
完成之前尚未完成对标准输出的写入。
一个解决方案是将 script3.py
的标准输出发送到其他地方。例如,这允许 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
会出现在终端上。