2015-02-19 4 views
1

Как импортировать пакеты и модули из разных мест в моем проекте, не перезагружая PYTHONPATH (потому что это похоже на «взломанное» решение).Python: импорт из вашего проекта без установки PYTHONPATH вручную

Например, если я следующую структуру каталогов:

proj 
├── __init__.py 
├── important_file.py 
└── subdirectory/ 
    ├── __init__.py 
    └── script.py 

Как импортировать important_file.py изнутри script.py? Могу ли я как-то указать в своем проекте, что proj - это мой корневой каталог, так что я могу импортировать важный файл с import proj.important_file?

ответ

0

Вы можете использовать

import sys 
sys.path.append('/path/to/root/directory') 

импортировать из любого каталога вы хотите. По крайней мере, это сработало для меня в прошлом. Может быть, есть еще меньше «Hacky» решения :)

0

Вы можете использовать относительные импорт

# inside subdirectory/script.py 
from .. import important_file 

, но на самом деле лучшее решение, чтобы добавить его в свой PYTHONPATH и сделать

import proj.important_file 
+0

Почему вы когда-либо использовали 'PYTHONPATH' для относительного импорта в пакеты? Только 'from .. import module' - это все, что необходимо, поскольку вопрос OP сформулирован. – Iguananaut

+0

@Iguananaut, вы не должны делать относительный импорт вообще. Конечно, не имеет смысла делать ОБА. Я отредактировал для уточнения –

+0

Я не согласен - относительный импорт хорош, если это часть политики проекта. Просто потому, что Гвидо не любит их, это не делает их неправильными, или они не будут частью языка. – Iguananaut

0

Я, как правило, предпочитать «питонические» решения, не обязательно то, что предложил @Gijs, на который я бы назвал больше работы.

Так что это то, что я не сделал много, но когда мне это нужно, я потратил много времени на это. Взгляните на это my repo. В нем у меня есть блок тестирования модулей, который я импортирую core.py в test_core.py.

Папка проекта структурирована следующим образом.

SNA (this is called first-repo on git, but SNA on my machine) 
├── bin/ 
└── sna/ 
    ├── core.py 
    └── test/ 
     └── test_core.py 

В text_core.py я импортировать свои функции из core.py. Я делаю это, используя следующую строку.

from SNA.sna.core import * 

Так что это общий формат.

from PROJECTNAME.DIR.FILE import * (or specific functions) 

Надеюсь, это поможет!

+0

Для этого требуется, чтобы 'SNA' находилась в' PYTHONPATH', что явно то, что OP пытается избежать по какой-то причине –

+0

Я сделал это примерно год назад, но я ничего не помню, чтобы что-то менять с помощью моего пути python. –

+0

Тогда вы должны были поместить каталог где-нибудь на свой «PATH» или «PYTHONPATH» изначально.Python не знает, как импортировать модуль, который не найден на пути. –

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