#python #pickle #joblib
#python #рассол #joblib
Вопрос:
Я пытаюсь загрузить сброшенный файл joblib из другого каталога, он выдает следующую ошибку
Traceback (most recent call last):
File "D:dirloader.py", line 5, in <module>
foob = joblib.load(r'D:foob.joblib')
File "C:programmingprogrammeFilesanacondaenvstensor_gpulibsite-packagesjoblibnumpy_pickle.py", line 585, in load
obj = _unpickle(fobj, filename, mmap_mode)
File "C:programmingprogrammeFilesanacondaenvstensor_gpulibsite-packagesjoblibnumpy_pickle.py", line 504, in _unpickle
obj = unpickler.load()
File "C:programmingprogrammeFilesanacondaenvstensor_gpulibpickle.py", line 1088, in load
dispatch[key[0]](self)
File "C:programmingprogrammeFilesanacondaenvstensor_gpulibpickle.py", line 1376, in load_global
klass = self.find_class(module, name)
File "C:programmingprogrammeFilesanacondaenvstensor_gpulibpickle.py", line 1426, in find_class
__import__(module, level=0)
ModuleNotFoundError: No module named 'foo'
Минимальный код для воспроизведения ошибки
Каталог выглядит следующим образом
D-
foo.py
dumper.py
foob.joblib
dir-
loader.py
foo.py
class Foo:
def __init__(self):
self.s = "here at Foo"
def __repr__(self):
return "fooObject"
dumper.py
import joblib
import foo
foob = foo.Foo()
joblib.dump(foob,'foob.joblib')
loader.py
import joblib
foob = joblib.load(r'D:foob.joblib')
print(foob)
Если я попытаюсь загрузить foob.joblib из того же каталога (D), он работает нормально, ошибка возникает во время выполнения loader.py из другого каталога
Ответ №1:
joblib.load()
требуется, чтобы все модули, необходимые для удаления, были в пути. Поэтому вам нужно каким-то образом добавить местоположение foo.py
системного пути во время загрузки.
Например, добавить:
import sys
import os
this_dir = os.path.dirname(__file__) # Path to loader.py
sys.path.append(os.path.join(this_dir, <rel_path_to_foo.py>))
в начало loader.py
Комментарии:
1. Это работает. Спасибо за это. Может быть, у вас есть какие-либо идеи о реализации с помощью пакетов? например, вместо добавления пути к системе импортировать файл, содержащий связанный класс?
2. Это действительно полезно, спасибо, как только я создал
this_dir
, я смог загрузить модель сmodel = load(f"{this_dir}/model.joblib")