Pickle не может импортировать существующий модуль? - PullRequest
4 голосов
/ 19 мая 2011

Почему это может случиться?

import window; print "LOADED"; data = cPickle.loads(data)

Результат:

LOADED
Traceback (most recent call last):
...
    import window; print "LOADED"; data = cPickle.loads(data)
exceptions.ImportError: No module named window

Он нормально загружает модуль, если я делаю import window, но при загрузке с cPickle, похоже, не работает.

Для получения дополнительной информации, которая, вероятно, имеет отношение:

Модуль, в котором я сохранил файл, находится в project1\MODULE\submodule\main.py. Модуль window равен project1\MODULE\window.py. main.py начинается:

import sys
sys.path.append("..\\..")
sys.path.append("..")
...
import window

Модуль, с которого я пытаюсь загрузить, находится в project2\project2sub\MODULE\data.py, без путаницы с путем sys.

MODULE одинаково в обоих случаях: модуль, который я хочу загрузить, равен project2\project2sub\MODULE\window.py.

Может ли добавление sys.path все это испортить?

Ответы [ 2 ]

4 голосов
/ 15 марта 2014

Pickle зависит от пути модуля. Независимо от того, как вы загружаете модули, если вы не связываетесь с sys.path, загрузка и сохранение маринада должны работать. Однако, если вы делаете import module.foo в одном месте и sys.path.append('module'); import foo, у вас есть два разных пути к модулям: в первом случае путь к модулю равен module.foo, а во втором - просто foo. Они не эквивалентны, и это помешает работе рассола.

4 голосов
/ 19 мая 2011

Убедитесь, что вы импортируете классы в программе , загружающей , так же, как в программе , сохраняющей .

Сохранение:

 import window
 myObj.window_obj = window.wObj

Загрузка

 import window
 myObj = cPickle.loads(data)

НЕ

Сохранение:

 from window import wObj
 myObj.window_obj = wObj

Загрузка:

 import window
 myObj = cPickle.loads(data)
...