You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不等待进程终止的情况下获取运行中进程的PID?

启动后台进程并获取PID的几种方案

1. 用subprocess.Popen(推荐)

这是Python官方推荐的进程管理方式,不依赖shell,安全且灵活,能直接获取PID,主程序不会被阻塞,批量启动也很好管理:

import subprocess

# 启动后台进程,可按需重定向标准输出/错误
proc = subprocess.Popen(
    ['python3', path],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    start_new_session=True  # 可选,让子进程脱离当前会话,避免主进程退出时被终止
)
pid = proc.pid
print(f"启动的进程PID: {pid}")

后续还能通过proc.poll()检查进程是否结束,proc.communicate()获取输出(如果需要),批量启动时直接循环创建Popen实例就行。

2. 改进你的os.popen写法

你原来的思路可以走通,但要注意读取输出,而且这种方式依赖shell,存在注入风险(如果path是用户输入的话):

import os

# 执行命令并读取PID
pid_output = os.popen(f'python3 {path} & echo $!').read().strip()
pid = int(pid_output)
print(f"启动的进程PID: {pid}")

这种写法虽然能拿到PID,但不如subprocess可控,不推荐用于批量场景。

3. 用os.fork(仅Unix/Linux可用)

如果是在类Unix系统上,可以用底层的fork机制创建子进程,完全不依赖shell,效率很高:

import os
import sys

def start_target_process(path):
    pid = os.fork()
    if pid == 0:
        # 子进程:执行目标脚本
        os.execvp('python3', ['python3', path])
        sys.exit(0)  # execvp成功的话不会执行到这里
    else:
        # 父进程:返回PID
        return pid

pid = start_target_process(path)
print(f"启动的进程PID: {pid}")

批量启动时循环调用这个函数即可,但Windows系统不支持os.fork,需要注意兼容性。

内容的提问来源于stack exchange,提问作者Effex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:01