用Popen打开一个流程并获得PID。

问题描述 投票:36回答:1

我正在开发一个很好的小功能。

def startProcess(name, path):
    """
    Starts a process in the background and writes a PID file

    returns integer: pid
    """

    # Check if the process is already running
    status, pid = processStatus(name)

    if status == RUNNING:
        raise AlreadyStartedError(pid)

    # Start process
    process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True)

    # Write PID file
    pidfilename = os.path.join(PIDPATH, name + '.pid')
    pidfile = open(pidfilename, 'w')
    pidfile.write(str(process.pid))
    pidfile.close()

    return process.pid

问题是 process.pid 不是正确的PID。似乎它总是比正确的PID低1。例如,它说进程开始于31729,但是...。ps 说它运行在31730。每次我试过,它都会偏离1,我猜测它返回的PID是PID的 当前 进程,而不是已启动的进程,而且新进程得到的是比它高1的 "下一个 "pid。如果是这样的话,我就不能只依靠返回的 process.pid + 1 因为我不能保证它永远是正确的。

为什么不 process.pid 返回新进程的PID,如何才能实现我想要的行为?

python subprocess popen
1个回答
37
投票

从文档中可以看到 http:/docs.python.orglibrarysubprocess.html。:

Popen.pid 子进程的进程ID。

请注意,如果你将shell参数设置为True,那么这就是被产卵的shell的进程ID。

如果 shell 是假的,我想,它应该会按照你的期望行事。

如果你依靠的是 shellTrue 用来解析可执行路径的 PATH 环境变量,你也可以通过使用 shutil.which 代替,然后把绝对路径传递给 Popen。(另外,如果您使用的是 Python 3.5 或更新的版本,您应该使用 subprocess.run 而不是波本。

© www.soinside.com 2019 - 2024. All rights reserved.