¿Cómo puedo instalar desde un subdirectorio git con pip?

104

Tengo un repositorio de git con muchas carpetas, una de ellas es un módulo de Python instalable con pip, como este:

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

Ahora mismo tengo que hacer lo siguiente para instalar:

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

¿Es posible instalar el módulo directamente con pip sin clonar explícitamente?

Lo intenté:

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

Pero obtengo:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
J. Martinot-Lagarde
fuente
1
Esta cuestión parece ya ser contestadas: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel
1
La pregunta que vinculó fue sobre archivos faltantes porque no hay MANIFEST.in. Mi pregunta es sobre cómo instalar un subdirectorio con pip, no faltan archivos ya que puedo instalar el paquete clonando todo el repositorio.
J. Martinot-Lagarde
@synthesizerpatel La pregunta a la que vinculó se refiere a algo diferente, pero el título era engañoso, así que lo corrigí. Puede considerar eliminar su (supongo) voto negativo.
Piotr Dobrogost

Respuestas:

120

Hay una solicitud de extracción con respecto a esta función, y parece que se fusionó para desarrollar la rama hace un mes. La sintaxis es la siguiente :

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

Probablemente tengamos que esperar un tiempo hasta que se combine con el maestro y se distribuya.

ACTUALIZACIÓN : Esto ahora está disponible y documentado en https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support de la siguiente manera:

Para proyectos donde setup.py no está en la raíz del proyecto, se utiliza el componente "subdirectorio". El valor del componente "subdirectorio" debe ser una ruta desde la raíz del proyecto hasta donde se encuentra setup.py.

Entonces, si el diseño de su repositorio es:

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

Necesitarás usar

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

Nota: en Windows, debe colocar la URL entre comillas dobles, o obtendrá un error "'subdirectorio' no se reconoce como un comando interno o externo". Por ejemplo, use:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"
Dennis Golomazov
fuente
4
Acabo de verificar y es parte de pip v1.5, lanzado el 1 de enero de 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka
20
Si está utilizando ubuntu, asegúrese de usar comillas simples antes de la ubicación real de git; de lo contrario, se ignorará el subdirectorio &. Por ejemplo: pip install -e 'git + git.repo /… '
Lin
8
Solo un aviso: esto no parece funcionar (al menos en pip v1.5.6, no estoy seguro de más de 6 versiones) para paquetes cuyos puntos de entrada se encuentran dentro del subdirectorio. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'da como resultado que el paquete parezca instalarse y un package.egg-linkarchivo se coloque en paquetes de sitio, pero apunta al directorio raíz de src/repo, no a src/repo/package, como era de esperar. Esto significa que py_modulesno se puede importar y en entry_pointsrealidad no funciona: ambos generan un ImportError: No module named package.
Mark G.
2
-eparece necesario, de lo contrario pip freezeno muestra todo el camino, solo el huevo. Esto sucedió elpip-1.5.4
zyxue
2
consejo para otros: TIENES que usar git + https, git + git no funcionará, obtendrás fatal: error remoto: repositorio no encontrado. presumiblemente porque no analiza correctamente la cadena de "consulta". Acabo de iniciar
amohr
33

Ya se indicó en uno de los comentarios debajo de la respuesta correcta, pero solo para resaltar este problema: al ejecutar esto desde la línea de comando de Linux, debe escapar del carácter- &ya que ampersand le dice a la línea de comando que ejecute un comando en segundo plano:

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

Observe la barra invertida antes del signo comercial. El comportamiento de escape puede depender de la distribución de Linux; No soy un experto
Si ignora esto, puede encontrarse con un error críptico como el siguiente:

bash: (...) command not found
rinderwahn
fuente
1
¿Incluir la URL entre comillas simples ayudaría a evitar la necesidad de escapar del signo comercial? Sé que es útil cuando se trabaja con URL en cURL.
Josh Peak
1
También vale la pena señalar: al ejecutar esto desde la línea de comandos de Windows, debe colocar la URL entre comillas dobles, o obtendrá un error "'subdirectorio' no se reconoce como un comando interno o externo". Por ejemplo, use pip install -e "git + myurl / proj # egg = subpkg & subdirectory = subdir "
En general, cuando trabaje con scripts de shell, use comillas dobles alrededor de los argumentos para estar seguro. para obtener más prácticas recomendadas, consulte: shellcheck.net o github.com/koalaman/shellcheck
Erik Aronesty
2
El escape también es necesario en OSX (ya que es una especie de distribución de Linux)
ygesher
6
Para uso de instalación basada en sucursales:pip install git+ssh://[email protected]/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK