Як я можу встановити з підкаталогу git за допомогою pip?


104

У мене є сховище git з багатьма папками, одна з них - модуль python, який можна встановити за допомогою pip, наприклад:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

Зараз я повинен зробити наступне, щоб встановити:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

Чи можна встановити модуль безпосередньо за допомогою pip без явного клонування?

Я намагався:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

Але я отримую:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'

1
Здається, на це питання вже відповіли: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel

1
Питання, яке ви зв’язали, стосувалося відсутніх файлів, оскільки в ньому немає файлу MANIFEST.in. Моє питання про те, як встановити підкаталог з pip, відсутні файли, оскільки я не можу встановити пакет, клонуючи ціле репо.
J. Martinot-Lagarde

@synthesizerpatel Питання, на яке ви посилаєтесь, задає різні речі, але назва вводить в оману, тому я його виправив. Ви можете розглянути можливість вилучити свій (я здогадуюсь) проти.
Piotr Dobrogost

Відповіді:


120

Щодо цієї функції є запит на вилучення , і він, здається, був об’єднаний для розвитку гілки місяць тому. Синтаксис такий :

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

Ймовірно, нам доведеться почекати деякий час, поки він не буде об’єднаний для освоєння та розподілений.

ОНОВЛЕННЯ : Це тепер доступно та задокументовано за адресою https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support наступним чином:

Для проектів, у яких setup.py відсутній у корені проекту, використовується компонент "підкаталог". Значення компонента "підкаталог" має бути шляхом, що починається від кореня проекту до місця, де знаходиться setup.py.

Отже, якщо макет вашого сховища:

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

Вам потрібно буде використовувати

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir

Примітка. У Windows ви повинні розмістити URL-адресу у подвійних лапках, інакше ви отримаєте помилку "" підкаталог "не розпізнається як внутрішня чи зовнішня команда". Наприклад, використовуйте:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"

4
Я щойно перевірив, і це частина pip v1.5, випущена 1 січня 2014 року: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka

20
Якщо ви використовуєте ubuntu, обов’язково використовуйте одинарні лапки перед фактичним розташуванням git, інакше підкаталог & ігнорується! Наприклад: pip install -e 'git + git.repo / ... '
Lin

7
Просто підказка: здається, це не працює (принаймні на pip v1.5.6, не впевнений у 6+ версіях) для пакетів, точки входу яких знаходяться в підкаталозі. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'призводить до того, що пакет з’являється для встановлення, а package.egg-linkфайл поміщається в пакети site - але він вказує на кореневий каталог src/repo, а не на src/repo/package, як я очікував. Це означає, що py_modulesїх не можна імпортувати і entry_pointsнасправді не працюють: вони обидва піднімають ImportError: No module named package.
Mark G.

2
-eздається необхідним, інакше pip freezeне показує весь шлях, лише яйце. Це сталосяpip-1.5.4
zyxue

2
порада іншим: ви ПОВИННІ використовувати git + https, git + git не буде працювати, ви отримаєте фатальний результат: віддалена помилка: сховище не знайдено. імовірно тому, що він не аналізує рядок "запиту" правильно. Я щойно ввійшов у систему: github.com/pypa/pip/issues/4898
amohr

33

Це вже було зазначено в одному з коментарів під правильною відповіддю, але лише для того, щоб підкреслити цю проблему: виконуючи це з командного рядка Linux, ви повинні уникнути &символу -character, оскільки ampersand говорить командному рядку, щоб запустити команду у фоновому режимі:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

Зверніть увагу на зворотну скісну риску перед амперсандом. Поведінка екранування може залежати від дистрибутива Linux; Я не фахівець.
Якщо ви проігноруєте це, ви можете натрапити на загадкову помилку, таку як:

bash: (...) command not found

1
Чи вкладання URL-адреси в одинарні лапки допоможе уникнути необхідності уникати амперсанда? Я знаю, що це корисно при роботі з URL-адресами в cURL.
Джош Пік,

1
Також варто зазначити: виконуючи це з командного рядка Windows, ви повинні розмістити URL-адресу у подвійних лапках, інакше ви отримаєте помилку "" підкаталог "не розпізнається як внутрішня чи зовнішня команда". Наприклад, використовуйте pip install -e "git + myurl / proj # egg = subpkg & subdirectory = subdir "

Загалом, працюючи зі сценаріями оболонки, використовуйте подвійні лапки навколо аргументів, щоб бути у безпеці. для отримання кращих практик див .: shellcheck.net або github.com/koalaman/shellcheck
Ерік Аронесті,

2
Втеча необхідна і в OSX (оскільки це свого роду дистрибутив Linux)
ygesher

6
Для встановлення на основі гілок використовуйте:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.