java – 使用subprocess.Popen的奇怪执行模式

前端之家收集整理的这篇文章主要介绍了java – 使用subprocess.Popen的奇怪执行模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个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脚本被忽略?

最佳答案
如果您确定您的shell脚本根本没有运行,并且第一个代码一切正常 – 那么它必须是java命令死锁或不使用call()函数正确终止.

您可以通过在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.

这些选项可能有答案;如果没有,他们会帮助调试过程.随意评论这一进展如何.

猜你在找的Java相关文章