упаковка подкаталога второго уровня - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть проектная архитектура, и я хочу сделать my_package pip доступным для установки. Проект содержит не только материал для упаковки, но и простые сценарии (быстрый и грязный) и другие вещи, которые важны для моего проекта, но не для пакета (например, внешние данные).

my_project
├── code
│   ├── data          #<-- I don't want to package this
│   │   └── make_dataset.py
│   ├── script        #<-- I don't want to package this
│   │   └── make_experiment.py
│   └── my_package    #<-- This is the module I want to package
│       ├── core.py
│       ├── utils.py
│       └── __init__.py
├── data
│   └── some_data.txt
├── references
│   └── reference_paper.pdf
├── reports
│   └── report.tex
├── LICENSE
├── README.md
├── requirements.txt
└── setup.py

Я бы хотел, чтобы файл setup.py находился в каталоге верхнего уровня, чтобы люди могли сделать обычный

git clone gitinstance.com/my_project
cd my_project
pip install .

и установить my_package модуль в своей среде, чтобы они уже могли python -c import my_package; print(my_package.__version__) и это работает.

Вопрос: Как я могу сделать my_package pip-installable без помещения setup.py в каталог code?

Обычноsetup.py будет выглядеть так:

from setuptools import find_packages, setup

setup(
    name='my_package',
    packages=find_packages(),
    version='0.1.0',
    description='Research project',
    author='Name',
    license='MIT',
)

Но здесь это не сработает, потому что setup.py не может найти my_package.

1 Ответ

0 голосов
/ 30 сентября 2019

Я нашел пример в документации setuptools, который более или менее соответствует моему сценарию использования.

Решение заключается в аргументах packages и package_dir setup функция, позволяющая указать, где искать пакеты для установки. Обычно это скрыто, поскольку по умолчанию используется текущий рабочий каталог.

В моем простом случае setup.py преобразуется в:

from setuptools import find_packages, setup

setup(
    name='my_package',
    packages=find_packages(where="code"),
    package_dir={'': "code"},
    version='0.1.0',
    description='Research project',
    author='Name',
    license='MIT',
)
...