py2exe не может импортировать модуль из другого каталога - PullRequest
2 голосов
/ 27 апреля 2011

Я связываю исходный код python с py2exe.Структура каталогов выглядит следующим образом:

some_Mod.py
some_dir/another_dir/some_Mod.py

Внутри последнего some_dir / another_dir / some_Mod.py Я пытаюсь импортировать другой модуль Python с

from ..some_Mod import *

Использование импорта не вызываетпроблемы с интерпретатором Python, но если я запускаю то же созвездие в комплекте, я получаю исключение:

 ImportError: No module named some_Mod

Может кто-нибудь объяснить, почему?

Примечание: Переименование модулей на самом деленет проблем, но мне просто интересно, почему py2exe не может справиться с этим созвездием.

Ответы [ 2 ]

5 голосов
/ 10 января 2014

Если у вас есть __init__.py файлы в каждом из этих подкаталогов, тогда все операторы импорта должны работать правильно.
Предполагая, что это не проблема, вот отличное руководство по импорту лучших практик:

http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/

Таким образом, никогда не используйте относительный импорт - всегда абсолютный (см. Ссылку выше, почему).

Во-вторых (и я не совсем уверен, почему), всегда храните ваш скрипт py2exe setup.py в той папке, где находится ваш основной скрипт.Я попытался изменить опцию 'script' в py2exe, чтобы мой скрипт находился где-то еще ... но ваша точная проблема произошла со мной.Поэтому убедитесь, что он находится там, где находится основной скрипт.

Наконец, вы всегда можете немного помочь py2exe.Я обычно должен добавить корневой каталог к ​​системному пути, чтобы операторы импорта были действительными.Обратите внимание, я не изменяю sys.path в любом кода моего приложения - только сценарий py2exe, который я использую для сборки exe.

В верхней части моего сценария установки py2exe:

import sys
sys.path.append(PATH_WHERE_PACKAGES_ARE)
# add any packages that need explicit importing here located in root directory:
import package1 # apparently it wasn't found...
import package2 # apparently same thing

Обычно я не импортирую пакеты, но обычно достаточно добавить корень проекта, где они существуют.

0 голосов
/ 27 апреля 2011

Я не уверен, что py2exe теперь, как обрабатывать синтаксис from ..some_Mod import *, проверьте это, чтобы убедиться, что модуль some_Mod.py правильно упакован: python -m py2exe.mf -d some_dir/another_dir/some_Mod.py, как объяснено в py2exe FAQ

...