Python lib psutil:如何使用 wait() 获取退出状态

cre*_*ive 1 python subprocess exit-code

我正在使用带有许多参数的 Subprocess Popen 执行第 3 方应用程序

myprocess=Popen(['executionlist','with','arguments'],stdout=PIPE,stderr=PIPE)
myprocess.communicate()
Run Code Online (Sandbox Code Playgroud)

获取我的 stdout 和 err 元组,第 3 方应用程序在后台启动,因此我在 stdout 中获取其 pid...[如果我尝试在前台运行,它会抛出“打开终端时出错:未知”] 我正在使用 psutil跟踪所有这些分叉并使用以下方式监控它:

EXITCODE=psutil_obj.wait(timeout=xxx)
Run Code Online (Sandbox Code Playgroud)

应用程序发送不同的退出代码,我需要在 EXITCODE 中访问这些代码,但当我在不同的 python 脚本中运行它时,它总是给我“无”值......

根据 https://code.google.com/p/psutil/wiki/Documentation “Wait() 进程终止,如果该进程是当前进程的子进程,也返回退出代码,否则无。”

无论如何,我是否可以从独立进程 ID 访问退出代码,而不是由 Popen 专门分叉的?

aba*_*ert 5

您引用的文档告诉您,psutil只能获得退出代码“如果该进程是当前进程的子进程”。

\n\n

这才是真正的关键\xe2\x80\x93,它不是进程是否由 启动Popen,而是它是否是当前进程的子进程。*

\n\n

这是 Unix 进程模型的基础。父母必须等待他们的孩子。您无法让其他人等待它们(除非重新设置它们的父级)。如果父进程仍在运行,则它必须是收割它们的人。如果父进程不再运行,则要么子进程已经是僵尸,要么它被重新指定为父进程的父进程或 init/launchd/等等。或者成为孤儿(不同系统和不同情况的细节有所不同)。不存在其他进程可以等待它们的情况。

\n\n

最重要的是,一旦父母打电话waitPopen.communicate如此),进程\xe2\x80\x94及其在系统进程表中的条目及其retcode\xe2\x80\x94可能甚至不再存在。

\n\n
\n\n

* 话虽这么说,即使您不跨进程,与或subprocess等较低级别的 API混合使用也不是一个好主意。如果你创建一个对象,你必须调用它的方法,或者其他为你做这件事的东西\xe2\x80\x94like 。一旦你这样做了,它可能就不再存在了。如果您想使用,请使用 fork/spawn/etc 创建的进程来执行。中的方法。如果您想使用,您可以使用由、 或 由,但不是由ospsutilPopenwaitcommunicateos.waitospsutil.waitospsutil.Popensubprocess.Popen

\n