Как я могу установить из подкаталога 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 Вопрос, на который вы указали ссылку, спрашивает о другом, но название вводит в заблуждение, поэтому я исправил его. Вы можете удалить свой (я полагаю) голос против.
Петр Доброгост

Ответы:

120

Существует запрос на перенос, касающийся этой функции, и, похоже, месяц назад он был объединен в ветку разработки. Синтаксис следующий :

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

Вероятно, нам придется немного подождать, пока он не будет объединен в master и распространен.

ОБНОВЛЕНИЕ : теперь это доступно и задокументировано на https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support следующим образом:

Для проектов, где setup.py не находится в корне проекта, используется компонент «подкаталог». Значением компонента «subdirectory» должен быть путь, начинающийся от корня проекта до места, где находится 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 /… '
Лин
8
Просто предупреждаю: похоже, это не работает (по крайней мере, на pip v1.5.6, не уверен в версиях 6+) для пакетов, точки входа которых находятся в подкаталоге. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'приводит к появлению пакета для установки и помещению package.egg-linkфайла в пакеты сайтов, но он указывает на корневой каталог src/repo, а не на src/repo/package, как я ожидал. Это означает, что py_modulesони не могут быть импортированы и entry_pointsфактически не работают: они оба вызывают расширение ImportError: No module named package.
Марк Г.
2
-eкажется необходимым, иначе pip freezeне показывает весь путь, только яйцо. Это произошлоpip-1.5.4
zyxue
2
Совет для других: вы ДОЛЖНЫ использовать git + https, git + git не будет работать, вы получите фатальную: удаленную ошибку: репозиторий не найден. предположительно потому, что он неправильно анализирует строку «запроса». Я только что
зашел
33

Об этом уже говорилось в одном из комментариев под правильным ответом, но просто чтобы выделить эту проблему: при выполнении этого из командной строки Linux вы должны избегать &-символа, поскольку амперсанд сообщает командной строке выполнить команду в фоновом режиме:

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

Обратите внимание на обратную косую черту перед амперсандом. Поведение при экранировании может зависеть от дистрибутива Linux; Я не специалист.
Если вы проигнорируете это, вы можете столкнуться с загадочной ошибкой, подобной следующей:

bash: (...) command not found
Rinderwahn
источник
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 03
6
Для установки на основе ветки используйте:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK