Подтвердить что ты не робот

Требования .txt vs setup.py

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

Как эти два файла действительно предназначены для использования?

4b9b3361

Ответ 1

requirements.txt

Это поможет вам настроить среду разработки. Такие программы, как pip можно использовать для установки всех пакетов, перечисленных в файле, одним махом. После этого вы можете приступить к разработке скрипта Python. Особенно полезно, если вы планируете, чтобы другие участвовали в разработке или использовали виртуальные среды. Вот как вы используете это:

pip install -r < requirements.txt

setup.py

Это позволяет создавать пакеты, которые вы можете распространять. Этот скрипт предназначен для установки вашего пакета в системе конечного пользователя, а не для подготовки среды разработки, как это pip install -r < requirements.txt. Смотрите этот ответ для более подробной информации о setup.py.

Зависимости вашего проекта перечислены в обоих файлах.

Ответ 2

Короткий ответ, что requirements.txt для перечисления только требования пакета. setup.py другой стороны, setup.py больше похож на скрипт установки. Если вы не планируете установку кода Python, обычно вам нужен только файл requirements.txt.

Файл setup.py описывает, в дополнение к зависимостям пакетов, набор файлов и модулей, которые должны быть упакованы (или скомпилированы, в случае собственных модулей (т.е. Написаны на C)), и метаданные для добавления в python списки пакетов (например, имя пакета, версия пакета, описание пакета, автор,...).

Поскольку оба файла имеют список зависимостей, это может привести к некоторому дублированию. Читайте ниже для деталей.

requirements.txt


В этом файле перечислены требования к пакету Python. Это простой текстовый файл (необязательно с комментариями), в котором перечислены зависимости пакетов вашего проекта Python (по одному на строку). Он не описывает способ установки вашего пакета Python. Обычно вы используете файл требований с помощью pip install -r requirements.txt.

Имя файла текстового файла является произвольным, но часто requirements.txt по соглашению. Исследуя репозитории исходного кода других пакетов Python, вы можете наткнуться на другие имена, такие как dev-dependencies.txt или dependencies-dev.txt. Они служат той же цели, что и dependencies.txt но обычно перечисляют дополнительные зависимости, представляющие интерес для разработчиков конкретного пакета, а именно для тестирования исходного кода (например, pytest, pylint и т.д.) Перед выпуском. Пользователям пакета, как правило, не требуется весь набор зависимостей разработчика для запуска пакета.

Если присутствует несколько вариантов requirements-X.txt, то обычно один перечисляет зависимости времени выполнения, а другой - время сборки или тестовые зависимости. Некоторые проекты также каскадно объединяют свой файл требований, т.е. когда один файл требований включает в себя другой файл (пример). Это может уменьшить повторение.

setup.py


Это скрипт Python, который использует модуль setuptools для определения пакета Python (имя, включенные файлы, метаданные пакета и установка). Он, как requirements.txt, также перечисляет зависимости пакета во время выполнения. Setuptools - это де-факто способ сборки и установки пакетов Python, но у него есть свои недостатки, которые со временем привели к разработке новых "менеджеров метапакетов", таких как pip. Примером недостатков setuptools является невозможность установки нескольких версий одного и того же пакета и отсутствие команды удаления.

Когда пользователь python pip install./pkgdir_my_module (или pip install my-module), pip запускает setup.py в указанном каталоге (или модуле). Аналогично, любой модуль, имеющий setup.py может быть pip -installed, например, с помощью запуска pip install. из той же папки.

Мне действительно нужны оба?


Короткий ответ - нет, но приятно иметь оба. Они достигают разных целей, но оба они могут быть использованы для перечисления ваших зависимостей.

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

 # requirements.txt
 #
 # installs dependencies from ./setup.py, and the package itself,
 # in editable mode
 -e .

 # (the -e above is optional). you could also just install the package
 # normally with just the line below (after uncommenting)
 # .

-e - это особая опция pip install которая устанавливает данный пакет в редактируемом режиме. Когда pip -r requirements.txt запускается для этого файла, pip установит ваши зависимости через список в ./setup.py. Редактируемая опция поместит символическую ссылку в каталог установки (вместо яйца или архивной копии). Это позволяет разработчикам редактировать код на месте из хранилища без переустановки.

Вы также можете воспользоваться тем, что называется "дополнительные функции setuptools", когда у вас есть оба файла в вашем хранилище пакетов. Вы можете определить дополнительные пакеты в setup.py в пользовательской категории и установить эти пакеты только из этой категории с помощью pip:

# setup.py
from setuptools import setup
setup(
   name="FOO"
   ...
   extras_require = {
       'dev': ['pylint'],
       'build': ['requests']
   }
   ...
)

а затем в файле требований:

# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]

Это сохранит все ваши списки зависимостей внутри setup.py.

Примечание. Обычно вы выполняете pip и setup.py из песочницы, например, созданные с помощью программы virtualenv. Это позволит избежать установки пакетов Python вне контекста среды разработки вашего проекта.

Ответ 3

Для полноты картины, вот как я это вижу в трех разных ракурсах.

  1. Их цели дизайна разные

Это точное описание, приведенное в официальной документации (выделено мной):

В то время как install_requires (в setup.py) определяет зависимости для одного проекта, Файлы требований часто используются для определения требований для полной среды Python.

Принимая во внимание, что требования install_requires минимальны, файлы требований часто содержат исчерпывающий список закрепленных версий с целью обеспечения повторяющихся установок всей среды.

Но это все еще может быть непросто понять, поэтому в следующем разделе приводятся 2 фактических примера, демонстрирующих, как эти два подхода должны использоваться по-разному.

  1. Их фактическое использование поэтому (должно быть) отличается

    • Если ваш проект foo будет выпущен как отдельная библиотека (то есть другие, вероятно, будут import foo), тогда вы (и ваши нижестоящие пользователи) захотите иметь гибкое объявление зависимостей, так что ваша библиотека не будет (и это не должно быть "требовательным" в отношении того, какой должна быть точная версия ВАШИХ зависимостей. Поэтому, как правило, ваш setup.py будет содержать такие строки:

      install_requires=[
          'A>=1,<2',
          'B>=2'
      ]
      
    • Если вы просто хотите как-то "документировать" или "закрепить" текущую среду EXACT для bar приложений, то есть вы или ваши пользователи хотели бы использовать bar приложений как есть, то есть запускать python bar.py, вы можете захотеть заморозьте свою среду, чтобы она всегда вела себя одинаково. В этом случае ваш файл требований будет выглядеть так:

      A==1.2.3
      B==2.3.4
      # It could even contain some dependencies NOT strickly required by your library
      pylint==3.4.5
      
  2. На самом деле, какой я использую?

    • Если вы разрабатываете bar приложения, которую будет использовать python bar.py, даже если это "просто скрипт для удовольствия", вам все равно рекомендуется использовать python bar.py, потому что, кто знает, на следующей неделе (которая случается на Рождество ) вы получите новый компьютер в качестве подарка, поэтому вам нужно будет заново настроить свою среду там.

    • Если вы разрабатываете библиотеку foo которая будет использоваться при import foo, вы должны подготовить файл setup.py. Период. Но вы все равно можете одновременно предоставить файл require.txt, который может:

      (a) либо в стиле A==1.2.3 (как объяснено в # 2 выше);

      (б) или просто содержать волшебный сингл .

      .
      

      что примерно равно "установить требования на основе setup.py" без дублирования. Лично я считаю, что этот последний подход как бы стирает черту, добавляет путаницы и на самом деле НЕ добавляет ценности, но, тем не менее, это уловка, основанная на подходе, упомянутом разработчиком пакетов Python Дональдом в его сообщении в блоге.