2010-11-11 18 views
21

Me gustaría que pip instale una dependencia que tengo en GitHub cuando el usuario emita el comando para instalar el software original, también desde la fuente en GitHub. Ninguno de estos paquetes está en PyPi (y nunca lo estará).¿Puede Pip instalar dependencias no especificadas en setup.py en el momento de la instalación?

el usuario emite el comando:

pip -e git+https://github.com/Lewisham/[email protected]#egg=cvsanaly 

Esta cesión temporal tiene un archivo requirements.txt, con otra dependencia en GitHub:

-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler 

Lo que me gustaría es un solo comando de que una el usuario puede emitir para instalar el paquete original, hacer que pip encuentre el archivo de requisitos y luego instalar la dependencia también.

Respuesta

36

This answer me ayudó a resolver el mismo problema del que está hablando.

No parece haber una manera fácil para que setup.py use el archivo de requisitos directamente para definir sus dependencias, pero la misma información se puede poner en la propia setup.py.

tengo unas pocas cosas requirements.txt:

PIL 
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor 

Pero al instalar el paquete que contiene de ese requirements.txt, los requisitos son ignorados por el PIP.

Este setup.py parece obligar a la pipa en la instalación de las dependencias (incluyendo mi versión de Django github-CKEditor):

from setuptools import setup 

setup(
    name='django-articles', 
    ..., 
    install_requires=[ 
     'PIL', 
     'django-ckeditor>=0.9.3', 
    ], 
    dependency_links = [ 
     'http://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3', 
    ] 
) 

Editar:

This answer también contiene alguna información útil.

La especificación de la versión como parte del "#egg = ..." es necesaria para identificar qué versión del paquete está disponible en el enlace. Nótese, sin embargo, que si uno siempre quiere depender de su última versión, puede configurar la versión de dev en install_requires, dependency_links y setup.py del otro paquete de

Editar: usando dev como la versión ISN No es una buena idea, según los comentarios a continuación.

+3

el truco con el "dev" solo funciona por primera vez y no en los tiempos posteriores. El archivo setup.py solo verifica la cadena "dev" como una versión para sí misma – DanEEStar

+2

@DanEEStar Correcto. Una vez que la versión _dev_ del paquete ha sido instalada, 'setuptools' considerará el requisito satisfecho. Como se demostró [en la respuesta vinculada] (http://stackoverflow.com/a/2163919/396967), deberá actualizar de forma sincrónica la versión del paquete en * los 3 lugares *: la dependencia es 'setup.py' y' install_requires' y 'dependency_links' - no es realmente práctico. – kynan

+1

yup, @DanEEStar tienes razón. He editado la recomendación de usar la versión 'dev'. ¡Gracias a ustedes dos! –

12

Aquí hay un pequeño script que utilicé para generar install_requires y dependency_links desde un archivo de requisitos.

import os 
import re 

def which(program): 
    """ 
    Detect whether or not a program is installed. 
    Thanks to http://stackoverflow.com/a/377028/70191 
    """ 
    def is_exe(fpath): 
     return os.path.exists(fpath) and os.access(fpath, os.X_OK) 

    fpath, _ = os.path.split(program) 
    if fpath: 
     if is_exe(program): 
      return program 
    else: 
     for path in os.environ['PATH'].split(os.pathsep): 
      exe_file = os.path.join(path, program) 
      if is_exe(exe_file): 
       return exe_file 

    return None 

EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$') 

install_requires = [] 
dependency_links = [] 

for requirement in (l.strip() for l in open('requirements')): 
    match = EDITABLE_REQUIREMENT.match(requirement) 
    if match: 
     assert which(match.group('vcs')) is not None, \ 
      "VCS '%(vcs)s' must be installed in order to install %(link)s" % match.groupdict() 
     install_requires.append("%(package)s==%(version)s" % match.groupdict()) 
     dependency_links.append(match.group('link')) 
    else: 
     install_requires.append(requirement) 
1

hace que responda a su pregunta?

setup(name='application-xpto', 
    version='1.0', 
    author='me,me,me', 
    author_email='[email protected]', 
    packages=find_packages(), 
    include_package_data=True, 
    description='web app', 
    install_requires=open('app/requirements.txt').readlines(), 
) 
+2

'open ('app/requirements.txt'). Readlines()' solo funciona si 'requirements.txt' solo contiene especificaciones de versiones" simples ", no URLs. Estos deberán dividirse en 'dependency_links' como lo hizo la respuesta de Simon Charette. – kynan

Cuestiones relacionadas