python2; pip анализирует требования с --trusted-host и --extra-index-url

я использую

install_requires = [str(ir.req) for ir in parse_requirements("requirements.txt", session=PipSession())]

С pip install .. Однако это, похоже, не работает с требованиями.txt, который выглядит так:

--trusted-host blah
--extra-index-url blah2
...

(поддержка --trusted-host была добавлена в pip8.0.0). Установка из blah терпит неудачу, потому что она жалуется на то, что она не является ненадежным хостом, как будто она никогда не обрабатывала первую строку.

, pip install -r requirements.txt работает отлично, поэтому эти параметры верны.

это означает, что есть что-то parse_requirements is не делать. у меня вопрос: как это исправить или обойти это, используя только pip install .? Я мог бы сделать что-нибудь ужасное, например:--9-->

os.system(pip install -r requirements.txt)
setup(...

в setup.py файл.

неявное соединение требований.txt и setup.py это сбивает меня с толку. Ничто в setup не вызывает требований.txt, если вы явно не анализируете требования.тхт, но требования.txt - очень стандартное соглашение python.

EDIT: мы используем инструменты (Cloudify и иногда шеф-повар), которые выполняют pip install .. Мы не можем это изменить. Я должен заставить это работать как pippable пакет, с --trusted-host и -- extra-index-urls без использования pip.conf или. В настоящее время мы делаем ОС.системный трюк.

2 ответов


там было много написано об использовании setup.py vrs. требования.формат txt. Setup.py для абстрактных требований. Требования.txt для конкретных требований. Другими словами, они служат разным целям. Тогда как требования.txt для окружающей среды, setup.py это для посылки. Так что это не имеет смысла для setup.py читать из требования.txt так же, как это не имело бы смысла для пакета deb читать из Поваренной книги шеф-повара. абстрактные vrs. Бетон Требования

часто причина, по которой люди делают это, они хотят поддержать людей, устанавливающих их пакет с pip install -r requirements.txt изнутри проверки без необходимости перечислять их зависимости дважды. Это разумная вещь, которую нужно хотеть, поэтому формат файла требований имеет конструкцию, которая позволяет это, просто сделайте требования.txt-файл, содержащий "."или "-Е ."и pip автоматически установит проект и все его зависимости.

изменить: Начиная с pip не является библиотекой, использование наиболее открытой части программы является самым безопасным (на мой взгляд). Альтернатива os.system и

import pip
pip.main(['install','-r','requirements.txt'])

этот ответ от goCards совершенно действителен и вы должны вероятно импортировать Пип от вашего setup.py если нет способа обойти pip install .. Но я хотел бы объяснить, что на самом деле происходит здесь. Вот что вам нужно знать:

  1. install_requires - это опция, поддерживаемая только setuptools, сторонним пакетом, который улучшает distutils (стандартный инструмент используемый внутри setup.py файлы и распространяются с помощью Python).
  2. по дизайну, setuptools принимаются только фактические требования в install_requires, поэтому такие параметры, как --trusted-host невозможно отправить в install_requires.
  3. вот почему вы используете parse_requirements("requirements.txt", session=PipSession()). Эта функция дает только пакеты. Строки опции, такие как --trusted-host bla не возвращаются, но отправляются в PackageFinder если вы дали один parse_requirements. Но вы не хотите, чтобы эти параметры были возвращены, потому что setuptools не будет знать, что с ними делать!

короче говоря, если вы хотите использовать параметры pip, вы нужно использовать pip.