Как указать в require.txt прямой источник на github


450

Я установил библиотеку с помощью команды

pip install git+git://github.com/mozilla/elasticutils.git

который устанавливает его прямо из репозитория Github. Это прекрасно работает, и я хочу иметь эту зависимость в моем requirements.txt. Я смотрел на другие билеты, как это, но это не решило мою проблему. Если я поставлю что-то вроде

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

в requirements.txtфайле pip install -r requirements.txtрезультаты приводят к следующему:

Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
  Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))

В документации файла требований не упоминаются ссылки с использованием git+gitспецификатора протокола, поэтому, возможно, это просто не поддерживается.

У кого-нибудь есть решение моей проблемы?

Ответы:


327

Синтаксис «редактируемых» пакетов можно использовать requirements.txtдля импорта пакетов из различных VCS (git, hg, bzr, svn) :

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

Кроме того, можно указать конкретный коммит:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils

3
Мне не удалось оформить локально такую ​​редактируемую версию (вероятно, из-за проблем с синтаксисом), и поэтому я воспользовался git+gitвариантом (который работал). В requirements.txtвашей версии работает, так что большое спасибо :)
Alfe

1
docsСсылка не работает для меня; Я использовал более старый .
Оса

42
Чего я не понял, так это того, что показанный синтаксис - это именно то, что входит в требования, то есть перед именем -e нет имени пакета.
мудрец

5
Добавление «-e» необязательно в зависимости от того, хотите ли вы, чтобы пакет находился в редактируемом режиме, см. Ответ по @qff.
Небо

17
Разве это не должно быть -e git+git://вместо -e git://? Я получил сообщение «Должен быть либо путь к локальному проекту, либо URL-адрес VCS, начинающийся с сообщения об ошибке svn +, git +, hg + или bzr +» .
Брюс Уэйн

424

Обычно ваш requirements.txtфайл будет выглядеть примерно так:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

Чтобы указать Github репо, вам не нужно package-name==соглашение.

Приведенные ниже примеры обновляются package-twoс использованием репозитория GitHub. Текст между @и #обозначает специфику пакета.

Укажите хеш коммита ( 41b95ecв контексте обновленного requirements.txt):

package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

Укажите название филиала ( master):

git+git://github.com/path/to/package-two@master#egg=package-two

Укажите тег ( 0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two

Укажите релиз ( 3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

Обратите внимание, что #egg=package-twoздесь не комментарий, а явное указание имени пакета.

В этом посте есть еще обсуждение этой темы.


54
Из всех других ответов я не могу поверить, что ни один из них просто не показал файл требований со смесью «нормальных» требований с добавлением мерзавца для сравнения. Меня так смутило то, что выглядело как параметры командной строки ( -e). Спасибо за то, что продемонстрировали сочетание обоих, чтобы я мог выразить это в контексте!
Хенди

Указание на выпуск 3.7.1с git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twoне работал для меня. То, что сработало для меня, было git+git://github.com/path/to/package-two@3.7.1#egg=package-two.
Жан Поль

Этот ответ был очень полезным. Хотя одна вещь. Эти git+git://...обозначения каким-то образом вызвали относительные ssh-ошибки на моем Linux-компьютере. В итоге я переключил их на git+https://...нотацию, и тогда они отлично работают.
RayLuo

174

requirements.txtпозволяет следующие способы указания зависимости от пакета в git-репозитории начиная с пипа 7.0: 1

[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject

Для Github это означает, что вы можете сделать (обратите внимание на пропущенное -e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

Почему дополнительный ответ?
Я был немного смущен -eфлагом в других ответах, так что вот мое пояснение:

-eИли --editableфлаг означает , что пакет установлен в <venv path>/src/SomeProjectи , таким образом , не в глубоко под землей <venv path>/lib/pythonX.X/site-packages/SomeProjectбыло бы в противном случае быть помещены в. 2

Документация


9
Но учтите, что если вы пропустите это, -eваш следующий pip freezeможет не дать правильных результатов для этого пакета
Maccesch

82

Сначала установите с помощью git+gitили git+httpsлюбым способом, который вам известен. Пример установки kronokветки brabeionпроекта:

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

Во-вторых, используйте, pip freeze > requirements.txtчтобы получить правильную вещь в вашем requirements.txt. В этом случае вы получите

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

В-третьих, проверьте результат:

pip uninstall brabeion
pip install -r requirements.txt

4
pip freeze все еще перечисляет пакет, который я использую как закрытую, переднюю версию. а не прямая проверка
GitHub

4
Вам нужно использовать опцию `-e 'для' pip freeze ', чтобы сгенерировать URL-адрес
Януш Сконечны

2
пункт 9.0.1:no such option: -e
sds

Вы имеете в виду git+https? В тексте вы говорите git+gitи в кодеgit+https
Энтони Хаткинс

@AntonyHatchkins исправлено.
OSA

17

Начиная с pip v1.5(выпущено 1 января 2014: CHANGELOG , PR ) вы также можете указать подкаталог git-репо, в котором будет содержаться ваш модуль. Синтаксис выглядит так:

pip install -e git+https://git.repo/some_repo.git#egg=my_subdir_pkg&subdirectory=my_subdir_pkg # install a python package from a repo subdirectory

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


2

Я обнаружил, что довольно сложно получить pip3 (v9.0.1, установленный менеджером пакетов в Ubuntu 18.04) для фактической установки того, что я ему советую установить. Я публикую этот ответ, чтобы сэкономить время, кто сталкивается с этой проблемой.

Поместить это в файл require.txt не удалось:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

Под «неудачей» я подразумеваю, что, хотя он загружал код из Git, он заканчивал тем, что устанавливал оригинальную версию кода, найденную в PyPi, вместо кода в репо в этой ветке.

Однако установка commmit вместо имени ветки работает:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname

Вы уверены, что ваш филиал также удален?
Альфе

Это не указывало на локальную копию, если это то, что вам интересно.
Сбросить счет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.