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

如何启动独立运行指定文件/模块的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:15:04