Python运行含SageMath代码调用Dask触发ImportError问题求解
报错触发原因
Dask分布式的worker进程为独立启动的Python进程,默认不继承主进程的已加载依赖与运行时环境。你仅在主进程中导入了SageMath的相关模块,worker进程并未初始化Sage的运行时:当待执行的并行函数引用Sage的对象时,序列化反序列化阶段会触发Sage扩展模块的重新加载,Cython扩展的依赖加载顺序异常最终导致cannot import name complex_mpfr报错。
解决方案
- 方案1:并行函数内部显式导入Sage依赖
在每个需要用到Sage能力的并行函数开头导入所需的Sage模块,保证worker执行时先正确初始化Sage运行时,修改后的代码参考如下:
from dask import delayed from dask.distributed import Client client = Client(n_workers=4) def Hello(): from sage.all import Integer Integer(1) + Integer(1) return 'Hello World' z = delayed(Hello)() z.compute()
- 方案2:所有worker预加载Sage环境
如果大量并行任务都需要用到Sage能力,可以在初始化Client后统一让所有worker预加载Sage,避免每个函数重复导入:
from sage.all import * from dask import delayed from dask.distributed import Client client = Client(n_workers=4) # 让所有worker进程预加载Sage完整环境 client.run(lambda: __import__('sage.all')) # 主进程可正常执行Sage代码 Integer(1) + Integer(1) def Hello(): Integer(1) + Integer(1) return 'Hello World' z = delayed(Hello)() z.compute()
内容的提问来源于stack exchange,提问作者Sam Ballas
相关产品推荐
相关产品推荐

