У меня есть requirements.txt
файл, который я использую с Travis-CI. Кажется глупым дублировать требования в обоих случаях, requirements.txt
и setup.py
я надеялся передать дескриптор файла в install_requires
kwarg setuptools.setup
.
Это возможно? Если да, то как мне это сделать?
Вот мой requirements.txt
файл:
guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
install_requires
используется для объявления зависимостей от пакетов, которые требуются для работы пакета и используются разработчиком пакета, в то времяrequirements.txt
как используется для автоматизации установки сред, что позволяет устанавливать дополнительное программное обеспечение и выполнять закрепление версии, и используются системными администраторами, внедряющими пакет. Их роль и целевая аудитория существенно различаются, поэтому попытка объединить их, как пожелания ОП, является настоящей ошибкой дизайна.[line.strip() for line in open("requirements.txt").readlines()]
?pkg_resources.parse_requirements()
Ответы:
Вы можете перевернуть его вокруг и список зависимостей в
setup.py
и имеют один символ - это точка.
- вrequirements.txt
вместо этого.В качестве альтернативы, даже если это не рекомендуется, все еще возможно проанализировать
requirements.txt
файл (если он не ссылается на внешние требования по URL) со следующим хаком (протестировано сpip 9.0.1
):Это не фильтрует маркеры среды, хотя.
В старых версиях pip, а точнее старше 6.0 , есть открытый API, который может быть использован для достижения этой цели. Файл требований может содержать комментарии (
#
) и может включать некоторые другие файлы (--requirement
или-r
). Таким образом, если вы действительно хотите разобрать a,requirements.txt
вы можете использовать pip-парсер:источник
setup(..., dependency_links=[str(req_line.url) for req_line in parse_requirements(<requirements_path>)], ...)
pip
умолчанию для разбора зависимости отsetup.py
в отсутствииrequirements.txt
, то простой ответ проницательно отметил Tobu ниже, чтобы получить список всех зависимостей вsetup.py
и удалитьrequirements.txt
. Для приложений, требующих и того, и другого, просто уменьшите список зависимостейrequirements.txt
до простого.
символа. Готово.На первый взгляд кажется, что
requirements.txt
иsetup.py
глупые дубликатами, но важно понимать , что в то время как форма похожа, предполагаемая функция очень отличается.При указании зависимостей цель автора пакета - сказать: «Где бы вы ни устанавливали этот пакет, это другие пакеты, которые вам нужны, чтобы этот пакет работал».
Напротив, у автора развертывания (который может быть одним и тем же человеком в разное время) есть другая работа, в которой они говорят: «Вот список пакетов, которые мы собрали вместе и протестировали и которые мне теперь нужно установить».
Автор пакета пишет для самых разных сценариев, потому что они размещают свою работу для использования способами, о которых они могут не знать, и не имеют возможности узнать, какие пакеты будут установлены вместе с их пакетом. Чтобы быть хорошим соседом и избежать конфликтов версий зависимостей с другими пакетами, им необходимо указать настолько широкий диапазон версий зависимостей, насколько это возможно. Это то, что
install_requires
вsetup.py
делает.Автор развертывания пишет для совсем другой, очень конкретной цели: один экземпляр установленного приложения или службы, установленный на конкретном компьютере. Чтобы точно контролировать развертывание и быть уверенным, что правильные пакеты протестированы и развернуты, автор развертывания должен указать точную версию и исходное местоположение каждого устанавливаемого пакета, включая зависимости и зависимости зависимости. С помощью этой спецификации развертывание может быть повторно применено к нескольким машинам или протестировано на тестовом компьютере, и автор развертывания может быть уверен, что одни и те же пакеты развертываются каждый раз. Это то, что
requirements.txt
делает.Итак, вы можете видеть, что, хотя оба они выглядят как большой список пакетов и версий, эти две вещи имеют совершенно разные задачи. И это определенно легко перепутать и ошибиться! Но правильный способ думать об этом -
requirements.txt
это «ответ» на «вопрос», заданный требованиями во всех различныхsetup.py
файлах пакетов. Вместо того, чтобы писать это вручную, он часто генерируется командой pip, которая просматривает всеsetup.py
файлы в наборе желаемых пакетов, находит набор пакетов, который, по его мнению, соответствует всем требованиям, а затем, после их установки, "замораживается". «этот список пакетов в текстовый файл (отсюда иpip freeze
название).Итак, вынос:
setup.py
должен объявить самые свободные версии зависимости, которые все еще работоспособны. Его задача - сказать, с чем может работать конкретный пакет.requirements.txt
это манифест развертывания, который определяет всю работу по установке и не должен рассматриваться как связанный с каким-либо одним пакетом. Его задача состоит в том, чтобы объявить исчерпывающий список всех необходимых пакетов для развертывания.Ссылки:
источник
requirements.txt
вместе с источником пакета, который содержит конкретные / замороженные требования для установки или тестирования. Навернякаsetup.py
можно использовать для этого в рамках самого проекта? Я могу только представить себе использование такого файла для инструментов, используемых для поддержки управления проектом (например, рефакторинг, создание релизов и т. Д.).requirements.txt
есть больше документации о состоянии мира, в котором была создана данная сборка, даже если она обычно не используется в самом процессе сборки? В этом есть смысл. Тем не менее, похоже, что несколько систем полагаются на дублирование: Travis устанавливает некоторые стандартные (старые) пакеты в вашем virtualenv и говорит использоватьrequirements.txt
. Если я спрашиваю, как обеспечить использование зависимостейsetup.py
, люди настаивают на том, чтобы я использовал ихrequirements.txt
.Он не может взять дескриптор файла.
install_requires
Аргумент может быть только строка или список строк .Конечно, вы можете прочитать ваш файл в скрипте установки и передать его в виде списка строк
install_requires
.источник
install_requires
. Однако это не работает, если вы не используете декларативный синтаксис.setup.py
это программа, которую нужно запустить, а не файл данных, который нужно проанализировать. Это не делает этот ответ хуже.include requirements.txt
в свой,MANIFEST.in
иначе вы не сможете установить свою библиотеку из исходного дистрибутива.В файлах требований используется расширенный формат пипса, который полезен только в том случае, если вам нужно дополнить свои
setup.py
более строгие ограничения, например, указав точные URL-адреса, из которых должны поступить некоторые зависимости, или выходные данные,pip freeze
чтобы заморозить весь пакет, установленный в известное-рабочее версии. Если вам не нужны дополнительные ограничения, используйте только asetup.py
. Если вы чувствуете, что вам действительно нужно отправить его вrequirements.txt
любом случае, вы можете сделать это одной строкой:Он будет действительным и относится точно к содержимому того
setup.py
же каталога.источник
pip install -r requirements.txt
) без установки самого пакета?-e .
должно быть достаточно. Проверьте эту страницу: caremad.io/posts/2013/07/setup-vs-requirementХотя это и не точный ответ на этот вопрос, я рекомендую пост в блоге Дональда Стиффта на https://caremad.io/2013/07/setup-vs-requirement/ чтобы хорошо этой проблеме. Я использовал это с большим успехом.
Короче говоря,
requirements.txt
это неsetup.py
альтернатива, а дополнение к развертыванию. Держите соответствующую абстракцию зависимостей пакета вsetup.py
. Устанавливатьrequirements.txt
или более для выборки определенных версий зависимостей пакетов для разработки, тестирования или производства.Например, с пакетами, включенными в репо
deps/
:pip выполняет пакет
setup.py
и устанавливает конкретные версии зависимостей, объявленных вinstall_requires
. Там нет двуличия, и цель обоих артефактов сохраняется.источник
pip install my-package
. Если зависимости для my-package не указаны в my-package / setup.py, они не устанавливаютсяpip install my-package
. Мне не удалось определить, как предоставить пакет для других, включающий зависимости, без явного указания их в setup.py. Хотелось бы узнать, нашел ли кто-нибудь, как сохранить его СУХИМ, позволяя другим устанавливать зависимости my-package +, не загружая файл требований и не вызывая его вручнуюpip install -r my-package/requirements.txt
.requirements.txt
. В этом весь смысл. Обновлен вопрос, чтобы сделать вещи более понятными. Также обновлена устаревшая ссылка на пост в блоге.Использование
parse_requirements
проблематично, поскольку API pip публично не документирован и не поддерживается. В пипе 1.6 эта функция на самом деле движется, поэтому ее существующее использование, скорее всего, прекратится.Более надежным способом устранения дублирования между
setup.py
иrequirements.txt
является конкретизация ваших зависимостей,setup.py
а затем добавление-e .
вrequirements.txt
файл. Некоторая информация от одного изpip
разработчиков о том, почему это лучший способ, доступна здесь: https://caremad.io/blog/setup-vs-requirement/источник
Большинство других ответов выше не работают с текущей версией API pip. Вот правильный * способ сделать это с текущей версией pip (6.0.8 на момент написания, также работал в 7.1.2. Вы можете проверить свою версию с помощью pip -V).
* Правильно, это способ использовать parse_requirements с текущим пипсом. Вероятно, это еще не лучший способ сделать это, поскольку, как сказано выше, pip не поддерживает API.
источник
Установите текущий пакет в Travis. Это позволяет избежать использования
requirements.txt
файла. Например:источник
pip freeze
файл require.txt и экспортировать этот файл куда-нибудь как артефакт (например, S3 или что-то еще), то у вас будет отличный способ повторной установки именно того, что вы испытания.from pip.req import parse_requirements
не работает для меня, и я думаю, что это для пустых строк в моем require.txt, но эта функция работаетисточник
Если вы не хотите заставлять своих пользователей устанавливать pip, вы можете эмулировать его поведение следующим образом:
источник
В пипе 10 следующий интерфейс устарел:
Поэтому я переключил его на простой анализ текста:
источник
pathlib
вариантом .Этот простой подход читает файл требований из
setup.py
. Это вариант ответа Дмитрия Сергеевича. . Этот ответ совместим только с Python 3.6+.Согласно DS ,
requirements.txt
можно задокументировать конкретные требования с конкретными номерами версий, тогда какsetup.py
можно задокументировать абстрактные требования со свободными диапазонами версий.Ниже приведен отрывок из моего
setup.py
.Обратите внимание, что
distutils.text_file.TextFile
будут лишены комментариев. Кроме того, по моему опыту, вам, очевидно, не нужно предпринимать каких-либо особых шагов для включения в файл требований.источник
ОСТОРОЖНО
parse_requirements
ПОВЕДЕНИЯ!Обратите внимание, что
pip.req.parse_requirements
изменит подчеркивания на тире. Это бесило меня на несколько дней, прежде чем я это обнаружил. Пример, демонстрирующий:производит
источник
[ir.req.unsafe_name for ir in req_deps if ir.req is not None]
Я создал для этого многоразовую функцию. Фактически он анализирует весь каталог файлов требований и устанавливает их в extras_require.
Последние всегда доступны здесь: https://gist.github.com/akatrevorjay/293c26fefa24a7b812f5
источник
pip._internal
... Если вы не предоставляете работающий внешний API, то вы не должны ломать все эти которые используют все, что вы предоставляете.Другое возможное решение ...
а потом использовать ...
источник
tree
взялась?Я бы не рекомендовал делать такие вещи. Как уже упоминалось несколько раз
install_requires
иrequirements.txt
определенно не должны быть в одном списке. Но так как есть много вводящих в заблуждение ответов, связанных с частными внутренними API pip , возможно, стоит поискать более разумные альтернативы ...Там нет необходимости для пипа , чтобы разобрать
requirements.txt
файл из Setuptoolssetup.py
сценария. Проект setuptools уже содержит все необходимые инструменты на своем верхнем уровне пакетеpkg_resources
.Это может более или менее выглядеть так:
источник
pip
синтаксический анализ, а неpkg_resources
до 2015 года, это ошибки, такие как github.com/pypa/setuptools/issues/470 . Это точное исправление в настоящее время, но я все еще немного боюсь его использовать, поскольку обе реализации, похоже, разрабатываются отдельно.Перекрестная публикация моего ответа из этого ТАКОГО вопроса для другого простого, pip-версии решения.
Затем просто добавьте все свои требования в
requirements.txt
корневой каталог проекта.источник
Я сделал это:
источник
Еще один
parse_requirements
хак, который также разбирает маркеры среды наextras_require
:Он должен поддерживать как sdist, так и бинарные диски.
Как утверждают другие,
parse_requirements
имеет несколько недостатков, поэтому это не то, что вы должны делать в публичных проектах, но этого может быть достаточно для внутренних / личных проектов.источник
parse_requirements()
, так что теперь это не получается.Вот полный взлом (проверенный
pip 9.0.1
) на основе ответа Ромена, который анализируетrequirements.txt
и фильтрует его в соответствии с текущими маркерами среды :источник
r.match_markers()
вы на самом деле оцениваете маркеры, что правильно сделать для sdist. Однако, если вы создаете двоичный дистрибутив (например, wheel), пакет будет перечислять только те библиотеки, которые соответствуют вашей среде сборки.wheel environment
(если это то, что человек пытается сделать), чтобы оценить маркеры против него?bdist_wheel
. Он не оценивает маркеры, он просто добавляет их кextras_require
.