2012-09-20 22 views
9

¿Cuál es la forma correcta de instalar paquetes pip en un virtual usando paquetes en caché? Intenté configurar --timeout=360 y --use-mirrors, pero el rendimiento de pypi es muy escaso, se cuelga o desconecta habitualmente, lo que hace que las implementaciones sean un desastre.Instalación de paquetes PIP en Virtualenv mediante un caché de descarga

lo tanto, mi plan era utilizar la opción --download-cache para todos los archivos de paquetes pre-descarga (pero no instalarlos), por ejemplo:

pip install --upgrade --timeout=120 --use-mirrors --no-install --download-cache /usr/local/pip/cache -r pip-requirements.txt 

y especifique la ubicación del caché durante la instalación en el virtualenv, por ejemplo:

virtualenv /usr/local/myapp/.env 
. /usr/local/myapp/.env/bin/activate; pip install --no-download --download-cache /usr/local/pip/cache -r pip-requirements.txt 
deactivate 

Creación de la caché fue muy frustrante, porque pip parece guardar nondeterministically el paquete descargado en el directorio caché. Específicamente, se negó a almacenar en caché Django==1.4.0, diciendo que "ese requisito ya se ha cumplido", así que tuve que usar el --force-reinstall.

La instalación con el caché es actualmente donde estoy atascado. Ejecutando el comando anterior me da el error:

Could not install requirement Django==1.4.0 (from -r pip-requirements.txt (line 1)) because source folder /usr/local/myapp/.env/build/Django does not exist (perhaps --no-download was used without first running an equivalent install with --no-install?) 
Storing complete log in /home/chris/.pip/pip.log 

¿Qué significa esto?

Los archivos:

http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2FD%2FDjango%2FDjango-1.4.tar.gz 
http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2FD%2FDjango%2FDjango-1.4.tar.gz.content-type 

sin duda existen en el directorio de caché y utilizan la opción --no-install.

¿Qué estoy haciendo mal?

+0

relacionado: ¿hay un mejor cdn/mirror al que pueda apuntar la aplicación, en lugar de crear una? – David

+0

Creo que es incorrecto usar el término "paquetes de pip". Quizás te refieres a paquetes PyPI o paquetes Python – glarrain

Respuesta

18

El problema parece ser que --download-cache solo se puede usar para especificar el caché para la descarga, no para la instalación. Por lo tanto, pip sigue buscando en /usr/local/myapp/.env/build/Django en lugar de /usr/local/pip/cache. ¿Ha intentado mover

pip install --upgrade --timeout=120 --use-mirrors --no-install --download-cache /usr/local/pip/cache -r pip-requirements.txt 

que después de la creación de virtualenv? Me pregunto si eso ayudaría.

Es posible que también desee intentar exportar PIP_DOWNLOAD_CACHE y ver si funciona sin usar --download-cache.

Esto es lo que parece que funciona:

pip install --no-install --use-mirrors --download=/DIRNAME PKGNAME 
pip install --find-links=file:///DIRNAME --no-index --index-url=file:///dev/null PKGNAME 

Ahora, en realidad, aquí es la herramienta para que yo usaría en lugar de todo lo anterior y que resuelve todo de los problemas mucho más elegante y confiablemente: pip2pi por David Wolever.

A partir de los documentos:

pip2pi builds a PyPI-compatible package repository from pip requirements

pip2pi le permite crear su propio índice PyPI mediante el uso de dos comandos simples:

  1. Para reflejar un paquete y todos sus requisitos, utilice pip2tgz:

    $ cd /tmp/; mkdir package/ 
    $ pip2tgz packages/ httpie==0.2 
    ... 
    $ ls packages/ 
    Pygments-1.5.tar.gz 
    httpie-0.2.0.tar.gz 
    requests-0.14.0.tar.gz 
    
  2. Para construir un índice de paquetes desde el directorio anterior:

    $ ls packages/ 
    bar-0.8.tar.gz 
    baz-0.3.tar.gz 
    foo-1.2.tar.gz 
    $ dir2pi packages/ 
    $ find packages/ 
    /httpie-0.2.0.tar.gz 
    /Pygments-1.5.tar.gz 
    /requests-0.14.0.tar.gz 
    /simple 
    /simple/httpie 
    /simple/httpie/httpie-0.2.0.tar.gz 
    /simple/Pygments 
    /simple/Pygments/Pygments-1.5.tar.gz 
    /simple/requests 
    /simple/requests/requests-0.14.0.tar.gz 
    
  3. Para instalar a partir del índice generó en el paso 2., puede simplemente usar:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2 
    

Bono: incluso se puede reflejar su propio index a un host remoto con pip2pi.

Cuestiones relacionadas