Я недавно изменил расположение каталога своей программы: прежде, у меня были все свои модули в "основной" папке. Теперь, я переместил их в каталог, названный в честь программы, и поместил __init__.py
там сделать пакет.
Теперь у меня есть единственный .py файл в моем основном каталоге, который используется для запуска моей программы, которая намного более опрятна.
Так или иначе попытка загрузиться в соленых файлах от предыдущих версий моей программы перестала работать. Я добираюсь, "ImportError: Никакой модуль не назвал инструменты" - который я предполагаю, то, потому что мой модуль был ранее в основной папке, и теперь это находится в whyteboard.tools, не просто простых инструментах. Однако код, который импортирует в жизнях модуля инструментов в том же каталоге как он, таким образом, я сомневаюсь, существует потребность определить пакет.
Так, мой каталог программы выглядит примерно так:
whyteboard-0.39.4
-->whyteboard.py
-->README.txt
-->CHANGELOG.txt
---->whyteboard/
---->whyteboard/__init__.py
---->whyteboard/gui.py
---->whyteboard/tools.py
whyteboard.py запускает блок кода от whyteboard/gui.py, который включает GUI. Этой проблемы соления определенно не происходило перед реорганизацией каталога.
AS Документы сортировки скажем, чтобы сохранить и восстановить экземпляр класса (на самом деле функции тоже), вы должны уважать определенные ограничения:
Score может сохранить и восстановить класс экземпляры прозрачно, однако определение класса должно быть импортируемым и жить в том же модуле, что и когда Объект был сохранен
wistteboard.tools
[один и тот же модуль как « инструменты
(даже если он может быть импортирован на Инструменты импорта
другими модулями в том же пакете, он заканчивается в Sys.modules
как Sys.modules ['otteboard.tools']
: это абсолютно важно, в противном случае тот же модуль импортируется К одному в том же пакете против одного в другом пакете будет оказаться множественными и возможными противоречивыми записями!).
Если ваши рассолотные файлы находятся в хорошем / расширенном формате (в отличие от старого формата ASCII, это значение по умолчанию только для соображений совместимости), мигрируя их после того, как вы выполняете такие изменения, могут на самом деле не Как тривиально, как «редактирование файла» (который является двоичным и C ...!), Несмотря на то, что предлагает еще один ответ. Я предлагаю, вместо этого вы делаете немного «сценарию для марифования»: пусть он Patch Sys.modules
Мне нравится ...:
import sys
from whyteboard import tools
sys.modules['tools'] = tools
, а затем cpickle.load
каждый Файл, del Sys.modules ['Tools']
, и cpickle.dump
Каждый загруженный объект обратно в файл: что временная дополнительная запись в Sys.modules
должна Позвольте успешно загрузку солений, затем выбросить их снова, следует использовать правильное имя модуля для классов экземпляров (удаляя, что дополнительная запись должна убедиться в этом).
Это нормальное поведение pickle, необработанные объекты должны иметь свой определяющий модуль для импорта .
У вас должна быть возможность изменить путь к модулям (то есть с tools
на whyteboard.tools
) путем редактирования обработанных файлов, поскольку они обычно являются простыми текстовыми файлами.