¿Cómo puedo hacer que setuptools instale un paquete que no está en PyPI?

142

Acabo de comenzar a trabajar con setuptools y virtualenv. Mi paquete requiere el último python-gearman que solo está disponible en GitHub. La versión python-gearman que está en PyPI es antigua. La fuente de Github es compatible con setuptools, es decir, tiene setup.py, etc. ¿Hay alguna forma de hacer que setuptools descargue e instale la nueva versión en lugar de buscarla en PyPI e instalar la anterior?

Para su información, el nuevo python-gearman es http://github.com/mtai/python-gearman

andrei
fuente
1
¿Hay alguna razón por la que intentas instalar un paquete de Python directamente desde Git en lugar de descargar la fuente desde allí y usarlo python setup.py installen el directorio de origen?
Andrew
44
Quiero que mi paquete se implemente en varias máquinas y que todas sus dependencias se instalen automáticamente.
andrei
2
Puede usarlo easy_installo pipinstalarlo directamente desde Github. Pero también hay otra solución, ¿ha considerado agregar el paquete a PyPI?
Wolph el
2
Ya que es simplemente para implementación, ¿por qué no usar buildout? Tiene un par de complementos Git listos para usar.
Wolph el
solución aquí: stackoverflow.com/a/17442663/1841871
zazabe

Respuestas:

156

La clave es decirle a easy_install dónde se puede descargar el paquete. En este caso particular, se puede encontrar en la url http://github.com/mtai/python-gearman/tarball/master . Sin embargo, ese enlace por sí solo no funcionará, porque easy_install no puede decir simplemente mirando la URL lo que obtendrá.

Al cambiarlo a http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta , easy_install podrá identificar el nombre del paquete y su versión.

El último paso es agregar la URL a los enlaces de dependencia de su paquete, por ejemplo:

setup(
   ...
   dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

Ahora, cuando se instala SU paquete, easy_install descubrirá que hay un "gearman 2.0.0beta" disponible para descargar desde esa URL, y lo seleccionará con gusto sobre el que está en PyPI, si especifica "gearman> = 2.0.0beta" en tus dependencias ..

(Normalmente, la forma en que se hace este tipo de cosas es incluir un enlace en la página de PyPI a la fuente descargable; en este caso, si el autor del paquete gearman hubiera incluido un enlace como el anterior, ya estaría configurado Por lo general, las personas marcan la versión de desarrollo con 'myproject-dev' y luego usan un requisito de 'myproject> = somever, == dev', de modo que si no hay un paquete de somever o superior, easy_install intentará echa un vistazo o descarga la versión).

Tendrá que especificar --process-dependency-linkscuando lo use pip. Tenga en cuenta que el procesamiento de enlaces de dependencia ha quedado en desuso y se eliminará en una versión futura.

PJ Eby
fuente
1
Hice lo que sugirió, pero cuando ejecuto "python setup.py development", dice "escribir dependency_links en foo.egg-info / dependency_links.txt", pero en realidad no descarga e instala el paquete. Estoy usando un virtualenv basado en setuptools si eso ayuda.
andrei
15
También debe tener install_requires = 'gearman> = 2.0.0beta'; ¿incluiste eso?
PJ Eby
3
No funciona para mí, con el betasufijo en una versión existente en PyPI, seguirá instalando el paquete desde PyPI en lugar del definido en dependency_links. Si intenta establecer una versión superior a la que existe en PyPI #egg=package-version, la herramienta de configuración se quejará con un Could not find a version that satisfies the requirementerror y una lista de todas las versiones disponibles en PyPI. Tenga en cuenta que estoy tratando de construir mi paquete con sdist, luego instalarlo con pip install http://url/to/my/generated/tar.
zazabe
1
ok, al instalar mi paquete easy_install http://url/to/my/generated/tar, todo funciona como se esperaba ... ¿Alguna idea de por qué?
zazabe
3
--process-dependency-linksha sido eliminado a partir de pip19! Ver: github.com/pypa/pip/issues/6162
phoenix
67

Puede usar el pip install protocol+location[@tag][#egg=Dependency]formato para instalar directamente desde la fuente usando pip.

Git

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

Mercurial

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

Bzr

pip install bzr+http://bzr.myproject.org/MyProject/trunk

Se admiten los siguientes protocolos: [+git, +svn, +hg, +bzr]

Versiones

@tag le permite especificar una versión / etiqueta específica para verificar.

#egg=name le permite especificar cuál es el proyecto como una dependencia para otros.

El orden siempre debe ser @tag#egg=name.

Repositorios Privados

También puede instalar desde repositorios privados cambiando el protocolo a SSH ( ssh://) y agregando un usuario apropiado ( git@):

git+ssh://git@github.com/username/my_private_repo

También puede instalar desde repositorios privados con un nombre de usuario / contraseña.

git+https://<username>:<password>@github.com/<user>/<repo>.git

Github ofrece la capacidad de crear tokens personales de OAuth que se pueden reciclar

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

requerimientos.txt

requirements.txt se usa para especificar dependencias del proyecto:

requerimientos.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

Estos no se instalan automáticamente con el paquete y deben instalarse con el comando pip -r requirements.txt.

Incluyendo archivos de requisitos

Los archivos de requisitos pueden incluir otros archivos de requisitos:

require-docs.txt

sphinx
-r requirements-dev.txt

require-dev.txt

some-dev-tool
-r requirements.txt

requerimientos.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

setup.py

Los archivos de requisitos pueden instalar dependencias especificadas setup.pycon el siguiente comando:

-e .

setup.pytambién se puede instalar desde repositorios usando la misma sintaxis que la anterior, pero usando el dependency_linksvalor como se menciona en esta respuesta .

Referencias

https://pip.pypa.io/en/latest/user_guide.html#installing-packages https://pip.pypa.io/en/latest/reference/pip_install.html

Rebs
fuente
2
setup.py PUEDE instalarse desde repositorios. Solo busque 'setup.py dependency_links'
TomDotTom
1
@TomDotTom Derp, incluso voté por esa respuesta pero de alguna manera no la asimilé = P Actualizaré mi respuesta. ¡Gracias por señalar eso! Ayudará con algunas cosas que estoy haciendo.
Rebs
dependecy_links Creo que se está depreciando aunque (?) github.com/pypa/pip/issues/3939 . Me encanta esta respuesta y creo que es mejor debido a que puedo (en setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L. el
21

Como sólo tenía que hacer lo mismo, he encontrado otra manera de hacer esto como pip's --process-dependency-linksestán programados para ser retirado en pip19,0 acuerdo con este comentario .

pip 18.1 incluye la siguiente característica

Permita que los requisitos de URL de PEP 508 se utilicen como dependencias.

De la descripción de PEP 508, la sintaxis para tales dependencias de URL se ve así:

Una búsqueda mínima basada en URL:

pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

Entonces en tu setup.pyparecería

setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

Tenga en cuenta que el enlace es un archivo de almacenamiento y también podría ser una versión o rama específica de un repositorio como se describe en esta respuesta . Además, vea esa respuesta para trabajar con otros hosts de repositorio.

Que yo sepa, la forma más fácil de actualizar la dependencia es mediante la pip install -I .instalación de su paquete desde su directorio.

Phil
fuente
¿Esto también es compatible con todo lo que es pip installcompatible, como las URL de git, #subdirectory=...etc.? ¿O se les ocurrió una nueva sintaxis con diferentes características expuestas de una manera diferente e incompatible?
Remram
Si no usa las herramientas de configuración y administra las dependencias manualmente en la línea de comando, parece que todavía tiene que usar el enfoque descrito por la respuesta de @Rebs .
Phil
1
Sólo para confirmar Esto funciona con distutils.core.setupypip 19.1.1
shouldsee
La resultante requirements.txt, sin embargo, no es compatible conpip install -r requirments.txt
debería ver
@ ¿debería ver a qué requirments.txtse refiere?
Phil
6

Vanilla setuptoolsno admite la descarga directa desde un repositorio de git, pero puede usar uno de los enlaces de Fuente de descarga de esa página, como:

easy_install http://github.com/mtai/python-gearman/tarball/master
Ned Deily
fuente
Entonces, para asegurarme de que esta versión de python-gearman esté instalada en cualquier servidor donde esté mi paquete, ¿tendré que ejecutar easy_install manualmente antes de instalar mi paquete?
andrei
Si usa easy_install, sí. Pero, como otros han señalado, podría cambiar a una administración de requisitos más sofisticada pipo buildoutque tenga una. Ver, por ejemplo: pip.openplans.org/#requirements-files
Ned Deily
En realidad, no tiene que ejecutar manualmente easy_install; simplemente puede agregar el enlace adicional a su setup.py. Escribiré una respuesta explicando los detalles.
PJ Eby
2
Como mencioné en mi comentario anterior, setup.py proporciona dependency_links que le permite descargar desde un repositorio de gti
TomDotTom