点击数:852
当引用非 python path
下的第三方模块或文件时,如果使用 ray actor 时会出现导入不了包的情况:
ModuleNotFoundError: No module named 'xx'
情况复现:
目录结构:

代码:
import os import sys print("当前python path:{}".format(sys.path)) from import_test import can_you_import_me can_you_import_me()
正常情况下,这里直接引用会报错:ModuleNotFoundError: No module named 'import_test'
,因为从 python path 中找不到 import_test 模块。如果在单机情况下,可以通过如下正常导入:
sys.path.append("/home/.../third_module_dir/") print("当前python path:{}".format(sys.path)) # 可以导入 from import_test import can_you_import_me can_you_import_me()
然而使用 ray actor
时,由于 每个ray actor 是一个单独的进程,每个actor实际使用的 python interpreter 与当前进程不同,在主进程设置的 sys.path 仅对当前进程有用。因此,使用 @remote 方式时,并不能保证remote进程中包含第三方模块路径。
import ray ray.init("ray://xxxx:port") """ remote时新建python进程,其sys.path 仍然是系统python path目录. 主进程的 sys.path 只对该进程的 python interpreter 有效 """ @ray.remote def f(): import sys print(sys.path) # sys.path.append(" /home/.../third_module_dir/") # print(sys.path) from import_test import can_you_import_me can_you_import_me() return can_you_import_me.s # 仍然会报错,需要在每个actor中导入sys.path ray.get(f.remote())
解决方案:
- 在
remote
作用域添加sys.path.append()
- 将第三方模块通过
setup.py/pip
方式安装
留言