Python, солящий после изменения каталога модуля

Я недавно изменил расположение каталога своей программы: прежде, у меня были все свои модули в "основной" папке. Теперь, я переместил их в каталог, названный в честь программы, и поместил __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. Этой проблемы соления определенно не происходило перед реорганизацией каталога.

39
задан LiraNuna 25 January 2010 в 01:04
поделиться

2 ответа

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 должна Позвольте успешно загрузку солений, затем выбросить их снова, следует использовать правильное имя модуля для классов экземпляров (удаляя, что дополнительная запись должна убедиться в этом).

70
ответ дан 27 November 2019 в 02:14
поделиться

Это нормальное поведение pickle, необработанные объекты должны иметь свой определяющий модуль для импорта .

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

5
ответ дан 27 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: