joblib: не удается загрузить сброшенный файл joblib из другого каталога

#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")