【发布时间】:2018-03-20 17:33:29
【问题描述】:
我有一个 Python 脚本,其中调用了一个 JAR。调用 JAR 后,会调用两个 shell 脚本。最初我是这样做的:
proc = subprocess.Popen(jar_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.wait()
output, errors = proc.communicate()
proc = subprocess.Popen(prune_command, shell=True)
proc.wait()
proc = subprocess.call(push_command, shell=True)
我必须等待前两个进程完成,所以我使用Popen(),最后一个我可以让它在后台运行,所以我call() 它。我通过 shell=True 是因为我希望被调用的 shell 脚本能够访问环境变量。
上述方法有效,但是,我没有从 JAR 进程中获得任何日志记录。我试过这样称呼它:
proc = subprocess.call(jar_command)
此日志如我所料,但未执行后面的两个 shell 脚本。最初我认为日志不会发送到stdout,但事实证明它们根本没有被执行。 IE。不删除多余的文件或推送到数据库。
为什么后续的 shell 脚本会被忽略?
【问题讨论】:
-
看来您可能使用了
Popen和call颠倒了 -call将等待子进程终止。 -
如果缓冲区填满,您对
.wait()的使用可能会导致死锁。 -
我通常更喜欢
check_call而不是call,因为如果返回非零退出代码,它会抛出异常。 -
我会通过 Python 脚本添加日志记录,以验证每个进程是否按预期执行和终止。我还会检查每个的输出和返回代码,以验证它们是否符合预期。
-
环境变量不需要
shell=True,除非你指的是来自BASH_ENV的变量。