tell pip to install the dependencies of packages listed in a requirement file
开发Django Web应用程序时,我有一个需要在virtualenv中安装的包列表。说:
1 2 3 4 5 | Django==1.3.1 --extra-index-url=http://dist.pinaxproject.com/dev/ Pinax==0.9b1.dev10 git+git://github.com/pinax/pinax-theme-bootstrap.git@cff4f5bbe9f87f0c67ee9ada9aa8ae82978f9890 # and other packages |
最初,我在开发过程中逐个手动安装它们。这安装了所需的依赖项,在部署应用程序之前,我最终使用了
问题是,随着我升级了一些包,一些依赖项不再使用,也不再需要,但它们一直由
现在,我想通过以下方式设置一个新的virtualenv:
- 将所需的包(没有它们的依赖项)放入需求文件中,
像manual-requirements.txt 一样 - 安装它们及其依赖项
pip install -r manual-requirement.txt (←问题,这不安装依赖项) - 冻结整个virtualenv
pip freeze -r manual-requirements.txt > full-requirements.txt
部署。
有没有办法在新的virtualenv中手动重新安装包以获取它们的依赖关系?这很容易出错,我希望自动化从不再需要的旧依赖项中清除virtualenv的过程。
编辑:实际上,PIP并不安装需求文件中没有明确列出的依赖项,即使文档告诉我们这些文件是平面的。我错误地认为应该安装哪些依赖项。对于怀疑PIP没有安装所有依赖项的人,我会让这个问题存在。
简单,使用:
1 | pip install -r requirement.txt |
它可以安装需求文件中列出的所有内容。
Any way to do this without manually re-installing the packages in a new virtualenv to get their dependencies ? This would be error-prone and I'd like to automate the process of cleaning the virtualenv from no-longer-needed old dependencies.
这就是pip tools包的用途(来自https://github.com/nvie/pip tools):
安装1 2 | $ pip install --upgrade pip # pip-tools needs pip==6.1 or higher (!) $ pip install pip-tools |
PIP编译的示例用法
假设您有一个烧瓶项目,并希望将其固定用于生产。将以下行写入文件:
1 2 | # requirements.in Flask |
现在,运行pip compile requirements.in:
1 2 3 4 5 6 7 8 9 10 11 12 | $ pip-compile requirements.in # # This file is autogenerated by pip-compile # Make changes in requirements.in, then run this to update: # # pip-compile requirements.in # flask==0.10.1 itsdangerous==0.24 # via flask jinja2==2.7.3 # via flask markupsafe==0.23 # via jinja2 werkzeug==0.10.4 # via flask |
它将产生你的
现在您有了一个
1 2 3 4 5 6 7 8 9 10 | $ pip-sync Uninstalling flake8-2.4.1: Successfully uninstalled flake8-2.4.1 Collecting click==4.1 Downloading click-4.1-py2.py3-none-any.whl (62kB) 100% |████████████████████████████████| 65kB 1.8MB/s Found existing installation: click 4.0 Uninstalling click-4.0: Successfully uninstalled click-4.0 Successfully installed click-4.1 |
考虑到您对这个问题的评论(您认为为单个包执行安装可以按预期工作),我建议循环访问您的需求文件。在巴什:
1 2 3 4 | #!/bin/sh while read p; do pip install $p done < requirements.pip |
嗯!