2

我用psutil.Popen 实例替换了 Python subprocess.Popen实例的一些使用,并期望行为保持不变。

Popen 状态的 psutil 文档:

stdlib subprocess.Popen 的更方便的接口。它启动一个子进程并像使用 subprocess.Popen 一样处理它,但此外它还在单个接口中提供了 psutil.Process 类的所有方法。

我发现终止进程时的返回码不一样,如下面的示例所示。

>>> import subprocess
>>> p = subprocess.Popen('sleep 100', shell=True)
>>> p.kill()
>>> p.wait()
-9
>>> 
>>> import psutil
>>> p = psutil.Popen('sleep 100', shell=True)
>>> p.kill()
>>> p.wait()
9
>>> 
>>> print sys.version
2.7.3 (default, Aug 28 2012, 13:02:46) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)]
>>> print psutil.__version__
2.1.1

当进程终止时,POSIX 对退出代码的保证是什么?以上返回码都有效吗?

4

2 回答 2

1

POSIX 退出代码的值是 0-255。POpen 的 retcode 与进程的退出代码并不完全相同,因为 POpen 有时会使用 -ve 代码。POpen 文档非常明确地说明了何时可以/将会发生这种情况:

参考文档:https ://docs.python.org/2/library/subprocess.html#subprocess.Popen.returncode 参考这个问题How to get exit code when using Python subprocess communication method?

但是,psutil 文档根本没有提到这一点: https ://code.google.com/p/psutil/wiki/Documentation#Classes (请参阅该wait(timeout=None)部分)。

我想哪个是“正确的”是有争议的,但是如果 psutil 应该遵循与 POpen 相同的界面,那么我认为这可能是一个错误/缺失的功能。

于 2014-09-03T08:55:00.383 回答
1

这是 psutil 中的一个错误,我现在已修复:https ://github.com/giampaolo/psutil/issues/960

于 2017-01-31T14:40:58.897 回答