#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. Хорошо, спасибо! Я думал о чем-то подобном (установка пакета), но не смог найти его нигде в их коде, так как я довольно новичок в подобных проектах. Это действительно помогло.