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

Python multiprocessing远程服务器报错:找不到defs模块

问题:multiprocessing多进程代码本地正常,远程服务器报错ModuleNotFoundError: No module named 'defs'

代码文件说明

defs.py代码

import numpy as np

def g(n):
    A = np.random.rand(n, n)
    B = np.random.rand(n, n)
    
    return A * B

def run_complex_operations(operation, input, pool):
    result = pool.map(operation, input)
    
    return result

主运行代码

import defs
import numpy as np
import time
import multiprocessing as mp


x = 10
n = 10000
l = [n] * x


start = time.time()

if __name__ ==  '__main__':
    processes_pool = mp.Pool(3)
    l[:] = defs.run_complex_operations(defs.g, range(x), processes_pool)

报错信息

Process SpawnPoolWorker-1:
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 114, in worker
    task = get()
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\queues.py", line 358, in get
    return _ForkingPickler.loads(res)
ModuleNotFoundError: No module named 'defs'

报错原因分析

1. 多进程启动模式的序列化逻辑限制

Python 3.8及以上版本在Windows系统中,multiprocessing默认使用spawn模式创建子进程。这种模式下,子进程会重新启动独立的Python解释器,重新导入主脚本并执行,而非直接复制父进程内存。当子进程需要反序列化父进程传递的defs.g函数时,必须能找到defs模块,若子进程的Python路径(sys.path)中不包含defs.py所在目录,就会触发模块找不到的错误。

2. 工作目录与模块路径不匹配

单独调用defs模块正常,是因为主进程的sys.path默认包含当前工作目录。但远程服务器上如果用绝对路径运行主脚本(比如python D:\scripts\main.py),子进程的当前工作目录可能不是D:\scripts,导致sys.path中没有该目录,无法定位到defs模块。而本地运行时,你大概率是在defs.py所在目录直接执行脚本,所以路径不存在问题。

3. Python版本差异的间接影响

虽然本地3.9.7和远程3.8.5都默认使用spawn模式,但不同版本的multiprocessing在子进程sys.path的初始化逻辑上存在细微差异,导致远程环境下的路径问题被暴露出来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:22