如何在不等待进程终止的情况下获取运行中进程的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
相关产品推荐
相关产品推荐

