У меня есть дерево каталогов
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, в субимпорте import (имя)
ImportError: нет модуля с именем my_utility
Отслеживание (последний вызов последний):
Файл "main.py", строка 12, в печати (* ray.get (ids), sep = '\ n')
Файл "/Users/aptx4869/anaconda3/envs/p35/lib/python3.5/site-packages/ray/worker.py", строка 2377, получает значение повышения ray.worker.RayTaskError: ray_worker (pid = 30025, host = AiMacbook)
Исключение: актер с именем MyWorker не удалось импортировать, поэтому он не может выполнить этот метод.
Если я удалю все операторы, относящиеся к ray
, приведенный выше код будет работать нормально. Поэтому я смело предполагаю, что причина в том, что ray
запускает каждый субъект в новом процессе, а 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__), '..')
- person spaniard   schedule 24.01.2019sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
. Но и это не работает ... - person Maybe   schedule 24.01.2019if __name__ == '__main__' and __package__ is None:
? а просто всегда добавлять к своему пути родительский каталог? - person spaniard   schedule 24.01.2019__init__.py
, не так ли? - person Maybe   schedule 24.01.2019__init__.py
во все каталоги, даже в корневой каталог, содержащий эти три папки. Это все еще не работает. - person Maybe   schedule 24.01.2019utils.py
иworker.py
, и я вижу, что у Рэя тоже есть эти файлы. Переименуйте файлы с префиксом, чтобы избежать конфликта. - person Darkonaut   schedule 24.01.2019print
. ИМХО, если ошибка вызвана конфликтом имен, не должно случиться так поздно. - person Maybe   schedule 24.01.2019multiprocessing.Pool
необходимо, чтобы импорт используемых функций выполнялся для каждой распределенной задачи снова. Я не знаком с внутренним устройством Ray, но эта строкаImportError: No module named 'utils'
заставляет меня задуматься. Похоже, он пытается импортировать утилиты изutils.py
, а не из каталога. - person Darkonaut   schedule 24.01.2019ImportError
относится к имени папкиmy_utility
вместоmy_utils.py
файла. Насколько мне известно, луч вызываетfrom my_utility import my_utils
в каждом новом процессе актора, и это вызывает эту проблему. - person Maybe   schedule 24.01.2019