python Popen调用shell卡住的问题

165 阅读1分钟

Python 调用shell脚本时,使用subprocess.Popen()的方式,而后使用遍历的方式读取日志输出时,会有一个隐藏的问题,即如果shell脚本中有后台执行的命令(即command &),就会让获取日志的子进程一直卡住,应该注意这种情况,在shell脚本中严谨的杀死此类进程

executeScriptProcess = subprocess.Popen(
    cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    shell=True,
    universal_newlines=True,
)

# 获取执行输出,如果cmd中或者cmd启动的一个脚本中存在类似command & 的后台持续运行的命令,那么会永远卡在这一句
# 即对executeScriptProcess.stdout的遍历不完成,且不会进行下一次遍历
for line in executeScriptProcess.stdout:
    executeScriptProcess.stdout.flush()  # 刷新缓存,防止缓存过多造成卡死
    print("ShellOut-> %s", line.rstrip("\n"))

# 等待执行结束
executeScriptProcess.wait()
print(
    "ShellReturncode-> %s", str(executeScriptProcess.returncode)
)