Структура пакета в Python
Введение | |
Пример | |
Похожие статьи |
Введение
Перед изучением этой статьи убедитесь, что вам знакомы темы «sys.path в Python» «Пакеты в Python» «Namespace пакеты в Python»
project_name ├── docs ├── README.rst ├── setup.py ├── src │ └── package_name │ ├── __init__.py │ ├── more_source.py │ └── subpackage1 │ └── __init__.py └── tests └── test_code.py
Корень проекта - project_name это не часть пакета
.rst означает reStructuredText
============ Project Name =========== A brief description of the project Section 1 ========= Installation or "quick start" information can go here. Subsetion --------- Some details can go here.
src содержит кода пакета
Важно помнить, что если запустить Python из project_name то эта директория будет добавлена
в sys.path
Значит всё, что лежит внутри может быть импортировано. В том числе и то, что не лежит
в package_name
А ведь именно то, что в package_name в конечном счёте получит пользователь вашего софта.
Тесты желательно хранить отдельно от пакета
Пример
python ├── demo_reader │ ├── README.rst │ ├── setup.py │ ├── src │ │ └── demo_reader │ │ ├── compressed │ │ │ ├── bzipped.py │ │ │ ├── gzipped.py │ │ │ └── __init__.py │ │ ├── __main__.py │ │ ├── multireader.py │ │ └── util │ │ ├── __init__.py │ │ └── writer.py │ └── tests │ └── test_multireader.py ├── test.bz2 └── test.gz
Из директории src можно выполнить
python -m demo_reader ../../test.gz
data compressed with gz by Andrei
# tests/test_multireader.py import unittest import demo_reader.multireader class TestMultireader(unittest.TestCase): def test_initialization(self): demo_reader.multireader.MultiReader('test_file.txt')
Рассмотрим пакет с setuptools
import setuptools setuptools.setup( name="demo_reader", version="1.0.0", description="Tools for reading various file formats", packages=setuptools.find_packages('src'), package_dir={'': 'src'})
Пакеты в Python | |
Namespace пакеты в Python | |
Правильная структура пакета | |
setuptools | |
Плагины | |
Python |