Python: Как импортировать пакет из подкаталога

#python #import #package #directory-structure #project-structure

#python #импорт #пакет #структура каталогов #проект-структура

Вопрос:

У меня следующая структура проекта:

 Project/
|-- src/
|   |-- package/
|       |-- __init__.py
|       |-- a.py
|       |-- b.py
|
|-- tests/
    |-- test_a.py
 

Мой __init__.py файл выглядит так

 from .a import some_function
from .b import SOME_CONSTANT
 

Но теперь я хочу запустить следующий код в test_a.py :

 import package

package.some_function()
 

Пока он находится в src/ каталоге, все работает нормально, я могу получить доступ ко всем импортам, определенным в моем пакете. Но я хочу, чтобы он был в tests/ каталоге.

При просмотре репозитория flask я обнаружил, что thex делает это так. Например, flasks test_appctx.py делает именно это:

 import flask

flask.do_something()
 

Как я могу добиться этого и в моем проекте?

Ответ №1:

Вы должны добавить src/ в папки, где искать функции:

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

Комментарии:

1. Я думаю, что-то подобное сработало бы, но это действительно хорошая практика? Если я правильно помню, я читал, что вам следует избегать манипуляций sys.path . И как тогда flask обрабатывает это? Я не видел ничего подобного в их коде (возможно, пропустил это, конечно)

2. Это определенно не очень хорошая практика ^^’ flask создал пакет, который они установили с помощью pip. В них setup.cfg они указывают на папку, в которую записан пакет: github.com/pallets/flask/blob/master/setup.cfg#L38 Проще говоря, вы можете собрать свои утилиты в папку (скажем src ), создать Project/setup.py файл и установить его pip install -e . из папки Project . Затем вы можете импортировать функции из любого места.

3. Хорошо, спасибо! Я думал о чем-то подобном (установка пакета), но не смог найти его нигде в их коде, так как я довольно новичок в подобных проектах. Это действительно помогло.