9

使用缓存包将 pip 包安装到 virtualenv 的正确方法是什么?我试过设置--timeout=360and --use-mirrors,但是 pypi 的性能太不稳定了,它经常挂起或断开连接,使部署成为一个废话。

所以,我的计划是使用 --download-cache 选项来预下载所有包档案(但不安装它们),例如:

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

然后在安装到 virtualenv 的过程中指定这个缓存位置,例如:

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

创建缓存非常令人沮丧,因为 pip 似乎不确定地将下载的包保存到缓存目录。具体来说,它拒绝缓存Django==1.4.0,说“这个要求已经得到满足”,所以我不得不使用--force-reinstall.

使用缓存安装目前是我卡住的地方。运行上面的命令给了我错误:

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

这是什么意思?

文件:

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

肯定存在于缓存目录中,我使用了该--no-install选项。

我究竟做错了什么?

4

1 回答 1

18

问题似乎是--download-cache只能用于指定缓存用于下载,不能用于安装。所以pip还是在看 /usr/local/myapp/.env/build/Django代替/usr/local/pip/cache。你试过搬家吗

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

到创建后virtualenv?我想知道这是否会有所帮助。

您可能还想尝试导出PIP_DOWNLOAD_CACHE并查看它是否可以在不使用--download-cache.

这是我发现的有效方法:

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

现在,实际上,这是我将使用的工具而不是上述所有工具,它更优雅、更可靠地解决了所有问题:David Wolever的 pip2pi。

从文档:

pip2pi 从 pip 需求构建一个与 PyPI 兼容的包存储库

pip2pi允许您使用两个简单的命令创建自己的 PyPI 索引:

  1. 要镜像包及其所有要求,请使用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. 要从上一个目录构建包索引:

    $ 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. 要从您在步骤 2 中构建的索引安装,您可以简单地使用:

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

奖励:您甚至可以使用pip2pi.

于 2012-09-21T06:21:09.247 回答