如何启动独立运行指定文件/模块的Python进程并实现共享内存?
实现独立Python子进程运行指定模块/文件并共享内存
完全可以实现你的需求,下面是具体的解决方案,兼顾代码分离和共享内存的要求:
一、启动独立子进程(彻底隔离主进程代码)
别用os.system,用subprocess模块更灵活可控,直接指定要运行的Python文件或模块,子进程只会加载目标脚本/模块,完全不会解析主进程的代码,自然不需要if __name__ == '__main__'这类防护。
示例代码:
- 运行指定模块:
import subprocess import sys # 启动子进程运行your_package下的target_module模块 subprocess.Popen([sys.executable, '-m', 'your_package.target_module'])
- 运行指定文件:
import subprocess import sys # 直接指定脚本路径启动子进程 subprocess.Popen([sys.executable, '/absolute/path/to/child_script.py'])
二、实现跨进程共享内存
下面两种方案都能满足需求,不用绑定multiprocessing的进程创建方式:
1. 用multiprocessing.shared_memory(推荐,Python 3.8+)
主进程创建共享内存块,把内存名称、数据的形状/类型通过命令行参数传给子进程,子进程凭名称连接到同一块内存。
主进程代码(main.py):
import subprocess import sys from multiprocessing import shared_memory import numpy as np # 准备要共享的数据 data = np.array([1, 2, 3, 4, 5], dtype=np.int32) # 创建共享内存,大小匹配数据字节数 shm = shared_memory.SharedMemory(create=True, size=data.nbytes) # 将数据写入共享内存 shared_arr = np.ndarray(data.shape, dtype=data.dtype, buffer=shm.buf) shared_arr[:] = data[:] # 启动子进程,传递共享内存的关键信息 subprocess.Popen([ sys.executable, 'child_script.py', shm.name, # 共享内存名称 str(data.shape), # 数据形状 data.dtype.name # 数据类型 ]) # 注意:主进程不要立刻关闭/删除共享内存,等子进程用完再处理 # shm.close() # shm.unlink()
子进程代码(child_script.py):
import sys from multiprocessing import shared_memory import numpy as np # 解析主进程传递的参数 shm_name = sys.argv[1] shape = tuple(map(int, sys.argv[2].strip('()').split(','))) dtype = np.dtype(sys.argv[3]) # 连接到已有的共享内存 shm = shared_memory.SharedMemory(name=shm_name) # 从共享内存读取数据 shared_arr = np.ndarray(shape, dtype=dtype, buffer=shm.buf) print("子进程读取到共享数据:", shared_arr) # 可以直接修改共享内存中的数据,主进程能看到变化 shared_arr[0] = 100 # 子进程用完后关闭共享内存(删除操作交给主进程) shm.close()
2. 用mmap模块(底层内存映射,无Python版本限制)
通过内存映射文件实现共享,主进程和子进程映射同一个文件,就能读写同一块内存区域。
主进程代码:
import subprocess import sys import mmap import os import numpy as np # 创建临时文件作为共享载体(也可以用固定路径) temp_path = '/tmp/shared_memory.tmp' # 写入足够的空字节,预留内存空间 with open(temp_path, 'wb') as f: f.write(b'\x00' * 20) # 5个int32,每个4字节,共20字节 # 映射文件到内存 with open(temp_path, 'r+b') as f: mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_WRITE) data = np.array([1,2,3,4,5], dtype=np.int32) # 将数据写入内存映射区域 mm.write(data.tobytes()) # 启动子进程,传递临时文件路径 subprocess.Popen([sys.executable, 'child_script_mmap.py', temp_path])
子进程代码(child_script_mmap.py):
import sys import mmap import numpy as np temp_path = sys.argv[1] # 映射同一个文件到内存 with open(temp_path, 'r+b') as f: mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) # 读取共享数据 data_bytes = mm.read(20) shared_arr = np.frombuffer(data_bytes, dtype=np.int32) print("子进程读取到共享数据:", shared_arr) # 可选:用完后删除临时文件 # os.unlink(temp_path)
三、核心注意事项
- 共享内存的生命周期要管好:
shared_memory创建的内存块,必须调用unlink才会真正释放;mmap的临时文件记得手动删除,避免残留。 - 传递参数要准确:不管是共享内存名称还是数据形状/类型,确保子进程能正确解析,不然会出现内存读写出错。
- 优先用
subprocess:比os.system更安全,能捕获子进程的输出、错误,还能控制子进程的状态。
内容的提问来源于stack exchange,提问作者Willy Wonka
相关产品推荐
相关产品推荐

