Как сделать, чтобы упаковать python модулей по отдельности, если они организованы в одном проекте? - PullRequest
4 голосов
/ 29 мая 2020

Я более опытен в Java и Maven, а настоящий новичок в Python, поэтому я действительно не имею представления о том, что можно делать, а что нет.

В Java , используя Maven , мы можем управлять версиями зависимостей в файле (родительский pom / модуль агрегатора), а затем повторно объявить в pom.xml подмодулей необходимые зависимости, пока исключая их версию, управляемую родителем pom. Таким образом, мы можем физически распространять субмодули (например, каждый модуль на машине), и каждый модуль будет упаковывать только свои необходимые зависимости, библиотеки, которые определены в его собственном файле pom.

Теперь вернемся к Python, в настоящее время я использую файл setup.py, который, насколько я понимаю, должен находиться в модуле root. Но затем он упаковывает все модули как одну библиотеку.

Есть ли способ лучше управлять модулями и их зависимостями и иметь возможность развертывать каждый (выбранный) модуль отдельно как независимый пакет со своими необходимыми библиотеками? Я хочу иметь возможность выбирать модули для отдельной упаковки, я не хочу, чтобы каждая папка, содержащая __init__.py, была упакована отдельно.

В настоящее время я использую Pipenv для управления своими зависимостями, но я готов к бросьте его, если он не соответствует дизайну, который я объяснил выше.

Спасибо

Ответы [ 4 ]

5 голосов
/ 17 июня 2020

requirements.txt

В java, как вы сказали, у нас есть наш pom. xml

В python у вас есть: requirements.txt с таким содержимым:

# Requirements without Version Specifiers #`
nose
nose-cov
beautifulsoup4

# Requirements with Version Specifiers #`
docopt == 0.6.1             # Version Matching. Must be version 0.6.1
keyring >= 4.1.1            # Minimum version 4.1.1
coverage != 3.5             # Version Exclusion. Anything except version 3.5
Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*

Для установки запустите следующее:

pip install -r requirements.txt

зависимости в java / maven

С maven у нас очень хорошее управление зависимостями:

org.acme.demo.springboot:acme-api:jar:1.0.0
+- mysql:mysql-connector-java:jar:8.0.13:compile
+- io.jsonwebtoken-jjwt:jar:0.9.1:compile
|  \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.7:compile
|     +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
|     \- com.fasterxml.jackson.core:jackson-core:jar:2.9.7:compile
+- com.jayway.jsonpath:json-path:jar:2.4.0:compile
|  +- net.minidev:json-smart:jar:2.3:compile
|  |  \- net.minidev:accessors-smart:jar:1.2:compile
|  |     \- org.ow2.asm:asm:jar:5.0.4:compile
|  \- org.slf4j:slf4j-api:jar:1.7.25:compile

Например: Мое приложение acme-api и имеет эти зависимости в своем pom. xml:

  • mysql: mysql -connector- java который ни от чего не зависит
  • io.jsonwebtoken-jjwt который зависит от jackson-databind, jackson-annotations и jackson-core

Если вы посмотрите исходный код jackson-core , вы найдете другой pom. xml с зависимостями, требуемыми jackson-core

Итак, в java / maven любой репозиторий исходного кода должен иметь pom. xml (приложение или библиотека), в котором мы можем найти или загрузить необходимые библиотеки


в зависимости dencies в python

Предыдущая стратегия в java / maven, связанная с pom. xml в любом исходном коде, не используется в python.

Я просмотрел пару публикаций c библиотеки, и я не нахожу requirements.txt внутри них o_O

Просто приложения используют requirements.txt например django.

* Библиотеки 1067 * используют setup.py вместо requirements.txt , а необходимые библиотеки жестко закодированы внутри setup.py :
install_requires=["oauthlib>=3.0.0", "requests>=2.0.0"],
extras_require={"rsa": ["oauthlib[signedtoken]>=3.0.0"]},

requirements.txt как pom. xml

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

install_requires=["oauthlib>=3.0.0", "requests>=2.0.0"],

Здесь вы найдете requirements.txt в любом python исходный код, и вы будете немного ближе к нашему Maven в Java

1 голос
/ 19 июня 2020

Нет ничего, что делало бы именно то, что вы хотите (по крайней мере, насколько мне известно). В python мы управляем зависимостями проекта или библиотеки с помощью файла requirements.txt и виртуальных сред. Оба из них управляют зависимостями проекта в целом.

Чтобы отделить отдельные модули от проекта, вы должны рассматривать их как отдельные проекты и делать то, что потребуется каждому проекту. Создайте файл requirements.txt или, если вам нужно установить его с помощью setup.py, поместите их внутрь.

Итак, для каждой «подбиблиотеки», которую вы хотите «отделить», создайте другой файл requirements.txt или настройте .py.

Есть эта библиотека под названием pipreqs (и, возможно, другие), которая сканирует папку и автоматически генерирует файл требований. Я всегда рекомендую вручную создавать файл требований сразу после установки любой библиотеки.

1 голос
/ 17 июня 2020

Надеюсь, это должно быть полезно. Говорит о паттерне, похожем на тот, который мы видели в java. Обычно в python у нас есть отдельные пакеты, которые используют друг друга и говорят, что они зависят друг от друга (или у нас есть один псевдо-главный пакет с init, который связывает его вместе).

Для java шаблон, простой способ - иметь несколько пакетов в одном репозитории системы управления версиями. В статье это подробно объясняется.

0 голосов
/ 17 июня 2020

Если вы хотите упаковать свой python код, вы можете посмотреть поэзию , хотя многопроектные сборки, такие как maven, не достижимы.

...