Ссылки на подпакеты Python - PullRequest
       13

Ссылки на подпакеты Python

0 голосов
/ 26 февраля 2010

Я почти закончил с тем, что должно быть чрезвычайно простым вопросом. Вот формат простого примера, который я написал, чтобы попытаться решить мою проблему. У меня есть папка с __all__ = ["p1","p2"] в __init__.py. Затем у меня есть подпапки p1 и p2 с __init__.py в обеих из них с __all__, снова определенными с именами двух простых модулей quick1 и quick 2 с quick1 в p1 и quick2 в p2. Если я импортирую top.p1.quick1 из скрипта за пределами top, то импорт работает нормально. Однако попытка импортировать top.p1.quick1 из quick2 приводит к ошибке File "quick1.py", line 1, in <module> import top.p2.quick2 ImportError: No module named top.p2.quick2 Как я могу импортировать модуль из другого подпакета? Насколько я могу судить, это должно работать в соответствии с документацией на Python. Кто-нибудь видит очевидную, тривиальную ошибку, которую я совершил?

Редактировать: Похоже, мне нужно добавить каталог с верхом к моему пути поиска. Я могу сделать это временно, установив PYTHONPATH. Однако есть ли лучший способ сделать это из сценария distutils?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Ваша проблема в том, что вашего топ-пакета нет в вашем sys.path.

2 голосов
/ 26 февраля 2010

Все, что вы описываете, просто прекрасно и не воспроизводит ошибку - вот самая простая версия, которую я могу придумать:

$ mkdir /tmp/path
$ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2
$ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py
$ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py
$ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py
$ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2'

и работает нормально. __all__ не имеют значения, если вы не используете from ... import *, который вы не используете (и вы не правы). Пока родительский каталог top (здесь /tmp/path) находится на sys.path, все будет хорошо; если этого родительского каталога нет, вы получите ошибку.

Итак, какое минимальное изменение вы можете внести в эту последовательность операций, чтобы воспроизвести ошибку, которую вы заметили?

...