2013-05-27 2 views
2

У меня есть модуль, который я собираю как яйцо с setuptools. У меня проблема с относительными/абсолютными изменениями.Яйца Python и относительный импорт

Структура каталогов заключается в следующем:

setup.py  # using setuptools 
mymodule/ 
|- __init__.py 
|- mymodule_core.py 
|- utils.py 

Когда я easy_installmymodule в системе из яйца, это импорт работает хорошо:

# mymodule_core.py 
from mymodule.utils import some_functions 

Но я хочу также запустить mymodule_core.py из команды line, без его установки (для коротких тестов и т. д.). В этом случае, предыдущий импорт потерпит неудачу, и это работает:

# mymodule_core.py 
from utils import some_functions 

Как обрабатывать import так что это будет работать в обоих случаях?

Я думаю, что правильное решение будет включать в себя if __name__ == "__main__", from .. import something и __package__ =, но я не могу заставить его работать

Связанный:

ответ

1

Один простой способ будет обрабатывать ImportError, как это ...

# mymodule_core.py 
try: 
    from mymodule.utils import some_functions 
except ImportError: 
    from utils import some_functions 

... который будет работать нормально в вашем случае.

В тех случаях, когда ваша структура пакета такова, что «родственник» импорт не будет работать, я, как правило, поставить что-то вроде этого в верхней части исходного файла ...

import sys 
import os 

PACKAGE_PARENT = '..' 
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))) 
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT))) 

... то синтаксис from packagename.modulename import symbols работает в любом случае.

Смежные вопросы