子进程PID与ps输出不同

4 投票
1 回答
4812 浏览
提问于 2025-04-16 08:32

为什么通过 Popen.pid 获取的子进程 ID 和用 ps 命令看到的值不一样呢?

我注意到这个问题,当我在 Python 里面用 subprocess.call() 调用 ps,或者在另一个终端里运行 ps 时,结果会不同。

这里有一个简单的 Python 文件可以用来测试:

#!/usr/bin/python3
'''
Test subprocess termination
'''

import subprocess

command = 'cat'

#keep pipes so that cat doesn't complain
proc = subprocess.Popen(command,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                    stdin=subprocess.PIPE,
                    shell=True)

print('pid = %d' % proc.pid)
subprocess.call("ps -A | grep -w %s" % command,
                    shell=True)

proc.terminate()
proc.wait()             # make sure its dead before exiting pytyhon

通常情况下,ps 返回的进程 ID 会比 Popen.pid 报告的值多 1 或 2。

1 个回答

5

因为这个命令是用 shell=True 这个选项运行的,所以返回的进程ID(pid)是用来执行这个命令的那个壳程序的进程ID。

撰写回答