2011-10-11 10 views
11

con el siguiente comando:¿Es posible engañar a pip install --find-links para que use un sdist descargado para - requisitos editables?

pip install -r requirements.txt -d sdists/ 

Usted puede crear fácilmente un archivo de los requisitos para la distribución con su proyecto. Esto funciona muy bien si sus necesidades se ven así:

Django==1.3.1 
django-tagging==0.3.1 
django-robots==0.6.1 

continuación, puede instalar estos requisitos sin tocar PyPI en absoluto, así:

pip install -r requirements.txt --find-links sdists/ --no-index 

¿Es posible utilizar el mismo método para --editable requisitos ? Por ejemplo:

-e hg+https://bitbucket.org/ubernostrum/django-contact-form/@1d3791fa4dfb#egg=django-contact-form 

Por lo que yo puedo decir, pip install -d descargas felizmente requisitos editables y crea una sdist para usted, pero pip install --find-links no tiene ninguna manera de hacer coincidir la sdist descargado con la línea asociada en el archivo de requisitos, por lo que ignora el sdist descargado y continúa revisando el código de VCS como de costumbre.

+0

podrías intentar establecer 'PIP_DOWNLOAD_CACHE' en algún directorio. Funciona para bitball 'tip' tarballs. Pero dudo que funcione para '@ revision # egg = package'. – jfs

+0

¿Hay alguna forma de especificar el tipo de SO? Estoy trabajando en una Mac, pero quiero las descargas para Centos (por ejemplo, criptografía-1.8.1-cp27-cp27m-macosx_10_10_intel.whl o cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

Hay una pequeña característica conocida de especificando la versión de un huevo como este '(...) # huevo = django-contact-form == xyz'. Quizás esto ayude aquí. El problema es el manejo de '--find-links' que se hace mediante herramientas de configuración y no de pip, y esto hace que muchas cosas sean difíciles o imposibles. –

Respuesta

4

Si bien no parece que esto sea estrictamente posible utilizando PIP, hay una solución que logra lo mismo. La solución alternativa es generar automáticamente un segundo archivo de requisitos del archivo de requisitos originales y del directorio sdists (para ser utilizado solo para ese directorio).

Una aplicación sencilla podría ser algo como esto (guardar en un archivo llamado "make_reqs.py"):

#!/usr/bin/env python 

import re 
import sys 
import os.path 

pat = '.+#egg=(.+)' 
allowed_exts = ['.zip', '.tar.gz', 'tar.bz2'] 

def find_version(sdists_dir, name): 
    files = [f for f in os.listdir(sdists_dir) if f.startswith(name)] 
    if len(files) != 1: 
     return '' 
    version = files[0].replace(name+'-', '') 
    for ext in allowed_exts: 
     version = version.replace(ext, '') 
    return version 

def get_requirements(file_name, sdists_dir): 
    out_reqs = ['--find-links file://%s' % os.path.abspath(sdists_dir)] 
    with open(file_name) as req_file: 
     reqs = [l.strip() for l in req_file.readlines()] 
     for req in reqs: 
      match = re.match(pat, req) 
      if match and not req.startswith('#'): 
       name = match.group(1) 
       version = find_version(sdists_dir, name) 
       if version: 
        out_reqs.append('%s==%s' % (name, version)) 
       else: 
        out_reqs.append(req) 
      else: 
       out_reqs.append(req) 
    return out_reqs 

if __name__ == '__main__': 
    print '\n'.join(get_requirements(*sys.argv[1:])) 

Para utilizar la secuencia de comandos, que haría algo como esto:

python make_reqs.py requirements.txt /path/to/sdists > sdist_reqs.txt 
pip install --no-index -r sdist_reqs.txt 
Cuestiones relacionadas