Импорт вложенных модулей в Python - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь импортировать несколько библиотек в мою программу (которая является приложением Google AppEngine). По сути, я должен поместить все библиотеки в корневую папку, но я только что создал другую папку с именем lib и поместил их в эту папку. (Я создал __init__.py)

Импорт работает нормально, используя import lib.module или from lib import module, но происходит то, что, когда я пытаюсь импортировать полный пакет, например папку с именем pack1 с различными модулями в ней, вызывая from lib.pack1 import *, Я получаю эту ошибку в одном из модулей, который получил статический доступ к другому модулю, то есть from pack1.mod2 import sth.
Какой простой и чистый способ преодолеть это? Без изменения самих библиотек.

Редактировать: Использование Python 2.7.
Редактировать: Ошибка: при использовании import lib.pack1 я получаю ImportError: No module named pack1.mod1.

1 Ответ

6 голосов
/ 14 октября 2010

Я думаю, что вместо from pack1.mod2 вы действительно хотите сказать from lib.pack1.mod2.

Редактировать: и, указав, какая версия Python это поможет, семантика импорта постепенно улучшалась с годами!

Редактировать: Ага! Спасибо за ваш комментарий; Теперь я понимаю. Вы пытаетесь переименовать библиотеки, не заходя в них и исправляя тот факт, что их имя теперь другое. Проблема в том, что то, что вы делаете, к сожалению, невозможно. Если все библиотеки использовали относительный импорт внутри, то у вас может быть шанс сделать это; но, увы, относительный импорт является (а) недавним и (б) широко не используемым.

Итак, если вы хотите использовать библиотеку p, вам нужно будет поместить ее в корневой каталог, а не в lib/p, потому что это создаст библиотеку с другим именем: lib.p, которая собирается сильно удивить библиотеку и сломать ее.

Но у меня есть еще две мысли.

Во-первых, если вы пытаетесь сделать это для организации ваших файлов, а не потому, что вам нужны разные имена для импорта, то (а) создайте lib, как вы делаете, но (б) не делайте не положить __init__.py внутрь! Вместо этого добавьте каталог lib в PYTHONPATH или, внутри вашей программы, в sys.path. (Позволяет ли GAE делать что-то подобное? У него есть PYTHONPATH?)

Во-вторых, я лгу, когда говорю, что это невозможно. Строго говоря, вы, вероятно, могли бы сделать это, добавив запись в sys.metapath, которая перехватывает все поиски модулей и пытается захватить их из lib, если они там существуют. Но - блин.

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