импорт python модулей и пакетов в разных подкаталогах одного проекта - PullRequest
1 голос
/ 12 января 2020

Я бы хотел выяснить самый чистый и желательно автономный способ использования моих пакетов в сценариях, которые находятся в другом каталоге, чем сам пакет.

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

Модули в lib необходимо как импортировать, так и запускать в виде скрипта.

У меня каталог проекта, как показано ниже, и у меня две проблемы:

  1. в lib/api.py я хочу правильно прочитать в data_files/key.txt, когда вызывается или импортируется api.py
  2. в testing_script.py Я хочу импортировать и использовать lib/get_data.py

Кажется, я не могу найти чистый способ сделать это, означает ли это, что мой проект структурирован не-pythoni c способом?

Спасибо за помощь.

my-project-git
├── LICENSE
├── README.md
├─── my_project
│   ├── data_files
│   │   ├── key.txt
│   │   ├── mappings.csv
│   ├── lib
│   │   ├── __init__.py
│   │   ├── api.py
│   │   └── get_data.py
│   └── test
│       ├── __init__.py
│       └── testing_script.py
├── requirements.txt
└── setup.py

1 Ответ

1 голос
/ 12 января 2020

Насколько я знаю, нет никакого pythoni c способа структурирования вашего проекта.

Это то, что Кеннет Рейтц рекомендовал в 2013 году, и как я его использую: https://www.kennethreitz.org/essays/repository-structure-and-python.

README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py

Внутри sample (my_project в вашем случае) вы можете разделить на категории по своему усмотрению. Например, Utils (общие функции), База данных (чтение, запись), Просмотр (пользовательские команды) и т. Д. c. Это зависит от вашего проекта.

Что касается вызова модулей на одном уровне, вы должны определить их в файле __init__ модуля верхней иерархии, который в данном случае равен sample.

Например:

__init__ в _ my_project

from sample.core import a_Class
from sample.core import a_function
from sample.core import anything

затем из /test/test_basic.py вы делаете:

from sample import a_Class
# or import sample

a = a_Class()  # use the class from core.py
# or a = sample.a_Class()

Take Посмотрите на репозиторий примеров модулей: https://github.com/navdeep-G/samplemod

...