working_dir\
main.py
my_agent\
my_worker.py
my_utility\
my_utils.py
每个文件中的代码如下。
""" main.py """
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from my_agent.my_worker import MyWorker
import ray
ray.init()
workers = [MyWorker.remote(i) for i in range(10)]
ids = [worker.get_id.remote() for worker in workers]
# print(*ids, sep='\n')
print(*ray.get(ids), sep='\n')
""" worker.py """
from my_utility import my_utils
import ray
@ray.remote
class MyWorker():
def __init__(self, id):
self.id = id
def get_id(self):
return my_utils.f(self.id)
""" my_utils.py """
def f(id):
return '{}: Everything is fine...'.format(id)
以下是收到的错误消息的一部分:
回溯(最近的调用最先): 文件“/Users/aptx4869/anaconda3/envs/p35/lib/python3.5/site-packages/ray/function_manager.py”,第616行,在fetch_and_register_actor中: unpickled_class = pickle.loads(pickled_class) 文件“/Users/aptx4869/anaconda3/envs/p35/lib/python3.5/site-packages/ray/cloudpickle/cloudpickle.py”,第894行,在subimport中: import(name) ImportError: No module named 'my_utility' 回溯(最近的调用最先): 文件“main.py”,第12行,在 print(*ray.get(ids), sep='\n') 文件“/Users/aptx4869/anaconda3/envs/p35/lib/python3.5/site-packages/ray/worker.py”,第2377行,在get中: raise value ray.worker.RayTaskError: ray_worker (pid=30025, host=AiMacbook) 异常:未能导入名称为MyWorker的actor,因此无法执行此方法
如果我删除所有与ray相关的语句,则上述代码可以正常工作。 因此,我大胆猜测原因是ray在新进程中运行每个actor,而sys.path.append仅在主进程中起作用。 因此,我将以下代码添加到worker.py中:
import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
但它仍然无法工作:相同的错误消息出现。我已经没有主意了,我该怎么办?
os.path.dirname(os.path.dirname(__file__))
比os.path.join(os.path.dirname(__file__), '..')
更好。 - spaniardif __name__ == '__main__' and __package__ is None:
吗?并且总是将父目录添加到你的路径中。 - spaniardprint
语句处。 在我看来,如果错误是由名称冲突引起的,那么它不应该发生得这么晚。 - Maybemultiprocessing.Pool
中,对于每个分布式任务,使用的函数必须再次进行导入。我不熟悉ray的内部结构,但是那行ImportError: No module named 'utils'
让我感到好奇。看起来它正在尝试从utils.py
而不是从目录中导入utils。 - Darkonaut