psutil/subprocess 进程被杀时的返回码

2 投票
2 回答
3525 浏览
提问于 2025-04-19 13:08

我把一些用Python的 subprocess.Popen 的地方换成了 psutil.Popen,本来以为它们的表现会一样。

psutil的Popen文档里说:

这是一个比标准库的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对退出代码有什么保证?上面提到的两个返回代码都是有效的吗?

2 个回答

1

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

1

POSIX的退出代码范围是0到255。POpen的返回代码和进程的退出代码不完全一样,因为POpen有时会使用负数代码。POpen的文档里明确说明了这种情况会在什么情况下发生:

参考文档:https://docs.python.org/2/library/subprocess.html#subprocess.Popen.returncode

参考这个问题:如何在使用Python的subprocess communicate方法时获取退出代码?

不过,psutil的文档里根本没有提到这一点:https://code.google.com/p/psutil/wiki/Documentation#Classes(请查看wait(timeout=None)部分)。

我觉得关于哪个是“正确的”这个问题可以争论,但如果psutil应该遵循和POpen相同的接口,那么我认为这可能是一个bug或者缺失的功能。

撰写回答