Как вы используете __init__.py? - PullRequest
6 голосов
/ 12 сентября 2011

Я пытаюсь узнать, как файл __init__.py работает для упаковки и вызова модулей из разных каталогов.

У меня есть такая структура каталогов:

init_test\
__init__.py
     a\
        aaa.py
     b\
        bbb.py

in aaa.py есть функция с именем test

bbb.py выглядит так:

import init_test.a.aaa
if __name__ == "__main__":
    init_test.a.aaa.test()

но это дает мне ImportError: No module named a.aaa

Что я делаю неправильно?Я пытался сделать ту же самую базовую вещь из модуля над структурой пакета, а не внутри пакета, и это тоже не сработало?Мой __init__.py

Ответы [ 3 ]

7 голосов
/ 12 сентября 2011

Вам также необходимо иметь __init__.py в каталогах a и b

Чтобы ваш пример работал первым, вы должны добавить базовый каталог к ​​пути:

import sys
sys.path.append('../..')

import init_test.a.aaa
...
2 голосов
/ 12 сентября 2011

Вы должны добавить пустой __init__.py в. Затем a распознается как подпакет init_test и может быть импортирован. Смотри http://docs.python.org/tutorial/modules.html#packages

Затем измените import init_test.a.aaa на import ..a.aaa, и оно должно работать. Это, как говорит Ахим, относительный импорт, см. http://docs.python.org/whatsnew/2.5.html#pep-328

Если вы действительно хотите запустить bbb.py, вы должны поместить init_test / в ваш путь к Python, например,

import sys
import os

dirname = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(dirname, "../.."))

import sys
sys.path.insert(0, ".")
import init_test.a.aaa
if __name__ == "__main__":
    inittest.a.aaa.test()

И тогда вы можете начать

python init_test/b/bbb.y

или если вы внутри б /

python bbb.py
0 голосов
/ 12 сентября 2011

__init__.py должен находиться в всех папках, которые вы хотите использовать в качестве модулей. В вашем случае это означает init_test/a и init_test/b тоже.

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