librerias - pip python
¿Es posible usar pip para instalar un paquete desde un repositorio privado de github? (13)
Como técnica adicional, si tiene el repositorio privado clonado localmente, puede hacer:
pip install git+file://c:/repo/directory
EDITAR: Más moderno, puede hacer esto (y -e
significará que no tiene que realizar cambios antes de que se reflejen):
pip install -e C:/repo/directory
Como el título sugiere, estoy tratando de instalar un paquete python desde un repositorio privado de github Para un repositorio público puedo emitir el siguiente comando que funciona bien:
pip install git+git://github.com/django/django.git
Sin embargo, si intento esto para un repositorio privado:
pip install git+git://github.com/echweb/echweb-utils.git
Me sale el siguiente resultado:
Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...
----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128
Supongo que esto se debe a que estoy intentando acceder a un repositorio privado sin proporcionar ninguna autenticación. Por lo tanto, traté de usar git + ssh con la esperanza de que pip usara mi clave pública ssh para autenticar:
pip install git+ssh://github.com/echweb/echweb-utils.git
Esto da el siguiente resultado:
Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
----------------------------------------
Command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build failed with error code 128
¿Alguien sabe si lo que estoy tratando de lograr es incluso posible? Si es así, ¿puedes decirme cómo?
Cuando estaba instalando desde github pude usar:
pip install git+ssh://[email protected]/<username>/<projectname>.git#egg=<eggname>
PERO, ya que tuve que ejecutar pip como sudo
, las claves SSH ya no funcionaban con github, el "clon git" falló en "Permiso denegado (publickey)". El uso de git+https
me permitió ejecutar el comando como sudo, y hacer que github me pregunte mi usuario / contraseña.
sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
Descubrí una forma de "instalar" de forma automática un repositorio privado de GitLab que no requiere una solicitud de contraseña. Este enfoque utiliza "Implementar claves" de GitLab y un archivo de configuración SSH para que pueda implementarlo utilizando otras claves que no sean sus claves SSH personales (en mi caso, para uso de un ''bot''). Tal vez alguien con alma amable pueda verificar usando GitHub.
Crear una nueva clave SSH:
ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"
El archivo debe aparecer como ~/.ssh/GitLab_Robot_Deploy_Key
y ~/.ssh/GitLab_Robot_Deploy_Key.pub
Copie y pegue el contenido del archivo ~/.ssh/GitLab_Robot_Deploy_Key.pub
en el cuadro de diálogo "Implementar claves" de GitLab.
Probar la nueva clave de implementación
El siguiente comando le dice a SSH que use su nueva clave de implementación para configurar la conexión. En caso de éxito, debería recibir el mensaje: "¡Bienvenido a GitLab, UserName!"
ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]
Crear el archivo de configuración SSH
A continuación, use un editor para crear un archivo ~/.ssh/config
. Añade los siguientes contenidos. El valor ''Host'' puede ser lo que quieras (solo recuérdalo, porque lo usarás más adelante). HostName es la URL de su instancia de GitLab. IdentifyFile es la ruta al archivo de clave SSH que creó en el primer paso.
Host GitLab
HostName gitlab.mycorp.com
IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key
Apunte SSH al archivo de configuración
@oxyum nos dio la receta para usar pip con SSH:
pip install git+ssh://[email protected]/my_name/my_repo.git
Solo necesitamos modificarlo un poco para que SSH use nuestra nueva clave de implementación. Lo hacemos señalando SSH a la entrada del Host en el archivo de configuración de SSH. Simplemente reemplace ''gitlab.mycorp.com'' en el comando al nombre de host que usamos en el archivo de configuración SSH:
pip install git+ssh://git@GitLab/my_name/my_repo.git
El paquete ahora debe instalarse sin solicitud de contraseña.
La sintaxis para el archivo de requisitos se da aquí:
https://pip.pypa.io/en/latest/reference/pip_install.html#requirements-file-format
Así por ejemplo:
-e git+http://github.com/rwillmer/django-behave#egg=django-behave
si quieres que la fuente se quede después de la instalación
o solo
git+http://github.com/rwillmer/django-behave#egg=django-behave
Si solo quieres que sea instalado.
Me pareció mucho más fácil usar tokens que las claves SSH. No pude encontrar mucha buena documentación sobre esto, así que encontré esta solución principalmente a través de prueba y error. Además, la instalación desde pip & setuptools tiene algunas diferencias sutiles; Pero de esta manera debería funcionar para ambos.
GitHub no (actualmente, a partir de agosto de 2016) ofrece una forma fácil de obtener el zip / tarball de los repositorios privados. Así que debes apuntar a setuptools para decirle a setuptools que estás apuntando a un repositorio git:
from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ[''GITHUB_TOKEN'']
setup(
# ...
install_requires=''package'',
dependency_links = [
''git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0''
.format(github_token=github_token, package=package, version=master)
]
Un par de notas aquí:
- Para repositorios privados, necesita autenticarse con GitHub; La forma más sencilla que encontré es crear un touth outh, colocarlo en su entorno y luego incluirlo con la URL.
- Debe incluir algún número de versión (aquí hay
0
) al final del enlace, incluso si no hay un paquete en PyPI. Este tiene que ser un número real, no una palabra. - Necesitas comenzar con
git+
para decirle a setuptools que es clonar el repositorio, en lugar de apuntar a un zip / tarball. -
version
puede ser una rama, una etiqueta o un hash de confirmación. -
--process-dependency-links
proporcionar--process-dependency-links
si se instala desde pip
Puede usar el esquema URI de git+ssh
, pero DEBE establecer un nombre de usuario:
pip install git+ssh://[email protected]/echweb/echweb-utils.git
Ver git@
parte en URI?
PS: También lea acerca de las claves de implementación .
PPS: en mi instalación, el esquema URI "git + ssh" funciona solo con los requisitos "editables":
pip install -e URI#egg=EggName
Recuerde : cambie el carácter :
que git remote -v
imprime en un carácter /
antes de usar la dirección del control remoto en el comando pip
:
$ git remote -v
origin [email protected]:echweb/echweb-utils.git (fetch)
^ change this to a ''/'' character
Si olvida, obtendrá este error:
ssh: Could not resolve hostname github.com:echweb:
nodename nor servname provided, or not known
Puedes hacerlo directamente con la URL de HTTPS de esta manera:
pip install git+https://github.com/username/repo.git
Esto también funciona simplemente añadiendo esa línea en el archivo Requirements.txt en un proyecto de Django, por ejemplo.
Si no desea utilizar ssh, puede agregar el nombre de usuario y la contraseña en la URL https.
El siguiente código supone que tiene un archivo llamado "pass" en el directorio de trabajo que contiene su contraseña.
export PASS=$(cat pass)
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
Si tiene su propia biblioteca / paquete en github / gitlab, etc., debe agregar una etiqueta para comprometerse con una versión concreta de la biblioteca, por ejemplo, v2.0, entonces puede instalar su paquete
pip install git+ssh://link/name/[email protected]
Esto funciona para mi Otras soluciones no han funcionado para mí.
También funciona con Bitbucket:
pip install git+ssh://[email protected]/username/projectname.git
Pip utilizará sus claves SSH en este caso.
También puede instalar una dependencia de repo privado a través de git+https://github.com/... URL proporcionando credenciales de inicio de sesión (inicio de sesión y contraseña, o token de implementación) para curl con el archivo .netrc
:
echo "machine github.com login ei-grad password mypasswordshouldbehere" > ~/.netrc
pip install "git+https://github.com/ei-grad/my_private_repo.git#egg=my_private_repo"
puedes intentar
pip install [email protected]/my_name/my_repo.git
sin ssh: ... eso es trabajo para mi.
oxyum''s solución oxyum''s está bien para esta respuesta, solo quiero señalar que debe tener cuidado si está instalando usando sudo
ya que las claves también deben almacenarse para root (por ejemplo, /root/.ssh
).
Entonces puedes escribir
sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git