我有一个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()和最后一个我可以让它在后台运行,所以我调用()它.我传递shell = True,因为我希望被调用的shell脚本可以访问环境变量.
但是,上面的工作,我没有从JAR进程中获取任何日志记录.我试过这样称呼它:
proc = subprocess.call(jar_command)
这是我所期望的日志,但后面的两个shell脚本不会被执行.最初我认为日志不是stdout,但事实证明它们根本没有被执行. I.E.不删除多余的文件或推送到数据库.
为什么后续shell脚本被忽略?
您可以通过在bash脚本中添加虚拟文件来验证这一点.把它放在脚本的第一行,所以如果它被执行,你将获得创建的虚拟文件.如果它没有创建,那意味着脚本没有被执行,可能是由于java执行的某些东西.
我会尝试几件事:
首先,我会返回Popen而不是打电话.而不是使用wait(),使用communic():
Interact with process: Send data to stdin. Read data from stdout and stderr,until end-of-file is reached. Wait for process to terminate.
communicate() returns a tuple (stdoutdata,stderrdata).
proc = subprocess.Popen(jar_command,stderr=subprocess.PIPE)
proc.communicate()
确保检查两个数据流(stdout和stderr).您可能会错过java进程引发的错误.
接下来我会尝试通过向Popen提供bufsize = 0来禁用缓冲区.它将消除与python缓冲相关的选项.
如果两个选项仍然不起作用,请尝试使用check_call()查看是否存在异常:
proc = subprocess.check_call(jar_command)
Run command with arguments. Wait for command to complete. If the return code was zero then return,otherwise raise CalledProcessError.
这些选项可能有答案;如果没有,他们会帮助调试过程.随意评论这一进展如何.