Распространение пакета Python с помощью инструментов установки

У меня есть проект python со структурой проекта с родственным импортом (импорт пакетов с одного уровня в структуру каталогов). Я смог заставить это работать с помощью инструментов настройки.

У меня есть setup.py со следующим на верхнем уровне моего пакета:

from setuptools import setup, find_packages

setup(name='myproject', version='1.0',
      packages=find_packages(), python_requires='>=3.4')

Затем я сделал pip3 install -e ., который позволил мне импортировать одноуровневые модули, добавляя к операторам импорта префикс myproject.. Это отлично работает, но когда я добавляю этот код в систему управления версиями и клонирую проект в другом месте, я сталкиваюсь с теми же проблемами с импортом родственных элементов. Есть ли способ избежать запуска этой команды для установки моего пакета верхнего уровня через pip каждый раз, когда кто-то клонирует это репо? Я пытался сделать все это в virtualenv и активировать его в месте, которое клонирует репо, а также поместить каталог .egg-info в систему управления версиями, но безрезультатно. Как я могу распространять этот пакет, чтобы, если этот репозиторий был клонирован, другие могли запускать код?

Я относительно новичок в python, поэтому заранее извиняюсь, если я упустил что-то очевидное. Если есть лучшие предложения по распространению этого кода, я также открыт для обучения. Заранее спасибо!

Изменить: (следуйте комментариям) Структура моего проекта (упрощенная) похожа на (ниже), где модули в a и b должны будут импортировать друг друга. Я смог сделать это, как упоминалось выше, но мой вариант использования потребует от меня развертывания этого кода и запуска скрипта по расписанию (предположим, a.py). Если у меня есть конвейер, развертывающий этот код, он должен работать без необходимости вручную запускать «pip install». Хотя я использовал инструменты настройки для решения проблемы с импортом родственных файлов, я понимаю, что это может быть неверный подход, и открыт для предложений. Заранее спасибо!

.
├── project
│   ├── a
│   │   ├── a.py
│   │   └── __init__.py
│   ├── b
│   │   ├── b.py
│   │   └── __init__.py
│   └── __init__.py

person Dave    schedule 15.07.2018    source источник
comment
Почему вы хотите, чтобы люди клонировали ваш исходный репозиторий и использовали ваш пакет непосредственно из исходного дерева, а не устанавливали его? Обычно это не очень хорошая идея. Когда это это правильная идея, вы должны проектировать все по-другому, и setuptools не может помочь (если только вы не хотите, чтобы люди собирали --inplace для перетасовки файлов в дереве исходного кода, но это обычно бесполезно). ), потому что setuptools касается установки вещей.   -  person abarnert    schedule 16.07.2018
comment
Возможно, тогда инструменты настройки не являются правильным подходом, я наткнулся на него, пытаясь решить проблему с импортом одноуровневых файлов. Что я ищу, так это развернуть мой код (через какой-то конвейер развертывания) на разных узлах кластера Hadoop и запустить его там. Если я не знаю, где он будет работать, мне нужен способ автоматической упаковки кода. Я пытаюсь клонировать репо на другом кластере и запустить как есть, чтобы убедиться, что это сработает.   -  person Dave    schedule 16.07.2018
comment
Для меня это похоже на XY-проблему. Почему бы вам не поделиться минимально воспроизводимым примером структуры вашего проекта и импорта вместе с ошибкой импорта, которую вы получаете ? Возможно, вам не нужно будет упаковывать код с помощью setuptools в конце концов.   -  person hoefling    schedule 16.07.2018
comment
@hoefling, ты прав, прошу прощения. Я обновил вопрос своим вариантом использования и минимальным примером структуры моего проекта.   -  person Dave    schedule 17.07.2018
comment
Я бы удалил __init__.py из каталога project (при условии, что это корневой каталог в Git), а затем после клонирования репозитория на целевой машине добавил каталог project в путь: export PYTHONPATH=/path/to/project.   -  person hoefling    schedule 17.07.2018
comment
Это сработало для меня, спасибо! Если вы сделаете это ответом, я могу выбрать его как лучший. Я добавил небольшой сценарий оболочки для экспорта пути python во время развертывания.   -  person Dave    schedule 18.07.2018


Ответы (1)


Когда вы устанавливаете с помощью pip, он находит все пакеты и устанавливает их относительно родительского пакета, поэтому вы можете импортировать, добавляя префикс к проекту. Поэтому везде, где вы хотите использовать, вам придется запускать pip.

Однако, если вы хотите избежать запуска без прохождения через pip, хотя это и не рекомендуется, вы можете сделать следующее, предполагая, что /app/home/packages является вашей текущей папкой:

    import sys
    sys.path.append("/app/home/packages")

Эта команда выполнит поиск всех модулей, а затем добавит их к вашему пути, чтобы вам не приходилось сталкиваться с импортом подмодулей (одноуровневых модулей). Но когда вы будете готовы распространять пакет, вы можете удалить его, чтобы сделать его чистым дистрибутивом.

person MichaelR    schedule 25.07.2018