点击数:1040

当引用非 python path 下的第三方模块或文件时,如果使用 ray actor 时会出现导入不了包的情况:

 ModuleNotFoundError: No module named 'xx'

情况复现:

目录结构:

src_dir 为我们的工作目录

代码:

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 方式安装

最后修改日期: 2021年12月1日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。