2014-08-30 3 views
2

Я знаю, что относительный импорт не рекомендуется, например, цитата из PEP8:Использование абсолютного импорта при разработке модулей Python?

Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that PEP 328 is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

Что делать, если я занимаюсь разработкой пакета (с несколькими модулями)? В процессе разработки абсолютный импорт не будет работать без установки/развертывания пакета. Означает ли это, что мне приходится периодически устанавливать/разворачивать текущие модули WIP только для тестирования?

Вот пример, представленный Cld. Учитывая Python проект/пакет:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

В main.py, абсолют-импорт работает очень хорошо:

import package1 
import package2.somescript 
import package2.somemodule 

Однако для модулей, как somescript.py в package2 следующие абсолютные-импорт:

import package2.somemodule 
import package1 

Это увеличит ImportError:

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 
+0

Одним из подходов, которые вы можете предпринять, является включение корня вашего проекта в переменную окружения 'PYTHONPATH'. Тогда весь ваш импорт может быть «абсолютным» (т. Е. Относительно корня вашего проекта). – arghbleargh

+0

Это может быть решением. – Drake

ответ

2

Depand где вы 'главный' файл.

, если у вас есть:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

somescript.py:

import package2.somemodule 
import package1 

main.py

import package1 
import package2.somescript 
import package2.somemodule 

Если выполнить: питон package2/somescript.py вы получите ошибка

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 

Но если вы выполните python main.py, у вас не возникнет проблемы.

+0

Спасибо за этот ясный пример. Поэтому как я могу обрабатывать '' абсолютный импорт'' в подмодулях, например 'somescript.py' в вашем примере? – Drake

+0

добавление 'import os, sys; sys.path.append (os.path.abspath (os.path.join (os.path.dirname (__ file__), os.path.pardir))); 'в начале' somescript.py' возможно ... Но действительно грязно ... – Cld

+0

Не очень хорошая идея, потому что вы должны комментировать их при развертывании, что увеличивает сложность цикла разработки-тестирования-развертывания. – Drake

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