psutil/subprocess 进程被杀时的返回码
我把一些用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或者缺失的功能。