我有一个pip需求文件,该文件在开发过程中会发生变化。
可以pip
是由卸载,不会出现在需求文件以及安装那些确实出现包?有没有标准的方法?
这将使pip需求文件成为软件包的规范列表-一种“仅当且仅当”的方法。
更新:我在https://github.com/pypa/pip/issues/716上将其建议为一项新功能
我有一个pip需求文件,该文件在开发过程中会发生变化。
可以pip
是由卸载,不会出现在需求文件以及安装那些确实出现包?有没有标准的方法?
这将使pip需求文件成为软件包的规范列表-一种“仅当且仅当”的方法。
更新:我在https://github.com/pypa/pip/issues/716上将其建议为一项新功能
Answers:
简短的答案是不,您无法使用pip做到这一点。
pip uninstall -r requirements.txt
-y
在@Ommit的命令中添加a以避免必须按Y并多次输入。从我的错误中学习。
pip uninstall -r requirements.txt
只会卸载您的requirements.txt中的版本。boto3==1.10.0
例如,如果您进行卸载,pip freeze
将显示boto3==1.0.1
以前是否已安装(或任何较旧的版本)。
这应该卸载require.txt中未包含的所有内容:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
尽管这对于-e
用来安装的软件包无法正常工作,即从git存储库或类似版本安装的软件包。要跳过这些,只需过滤掉以-e
标志开头的包:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
然后,显然:
pip install -r requirements.txt
2016年更新:不过,
您可能真的不想真正使用上述方法。找出pip-tools
并pip-sync
以更强大的方式完成您可能要完成的任务。
https://github.com/nvie/pip-tools
2016年5月更新:
您现在也可以使用pip uninstall -r requirements.txt
,但是基本上可以达到相反的效果-可以卸载requirements.txt
2019年5月更新:
检查pipenv。软件包管理领域发生了很多事情,使这种问题过时了。不过,我实际上仍然很高兴使用pip工具。
project.config
放在弹性Beanstalk上的Django文件中05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
。现在,仅通过使用中的注释,就可以回滚pip包而无需重建环境requirements.txt
。这为我节省了真正的停机时间。谢谢!
pip freeze
发表评论,但是有一天他们可能会将其添加到API中,如果这样做,它将是有效的。如果他们不这样做,那么以上内容就是禁止操作。破折号允许您使用上一条命令中的stdin,在这种情况下,破折号告诉grep将pip freeze
pip freeze
这不是的功能pip
,不。如果您确实想要这样的东西,则可以编写脚本以将的输出pip freeze
与您的进行比较requirements.txt
,但这可能会比其价值更大。
使用virtualenv
,只需创建一个干净的环境并从重新安装即可requirements.txt
,这样更容易且更可靠:
deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt
requirements.txt
),为什么还要再次安装它呢?
您现在可以将-r requirements.txt
参数传递给pip uninstall
。
pip uninstall -r requirements.txt -y
至少从pip
8.1.2开始,pip help uninstall
显示:
...
Uninstall Options:
-r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be
used multiple times.
...
这是一个古老的问题(但还是个好问题),自从被问到以来,情况已经发生了很大变化。
pip-sync
在另一个答案中有一个临时引用,但值得自己回答,因为它可以精确地解决OP的问题。
PIP同步需要一个requirements.txt
文件作为输入,而“trues了”当前的Python环境,使其符合究竟是什么在这requirements.txt
。这包括从中删除环境中存在但不存在的所有软件包 requirements.txt
。
例如:假设我们希望我们的ENV含有(只)3个库:libA
,libB
,和libC
,就像这样:
> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2
但是我们的环境目前包含libC
和libD
:
> pip freeze
libC==1.2
libD==1.3
运行pip-sync将导致这种情况,这是我们想要的最终状态:
> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2
Stephen的提议是一个好主意,但是不幸的是,如果您仅在文件中包含直接要求,那么它就行不通,对我来说听起来更干净。
所有依赖项都将被卸载,包括甚至distribute
崩溃pip
。
这是我尝试对虚拟环境进行版本跟踪的方法。我尝试保持最低requirements.txt
要求,仅包括直接要求,甚至在不确定的地方甚至不提及版本约束。
但是除此之外,我保留并在版本跟踪(例如git)中包含venv.pip
文件中我的virtualenv的实际状态。
这是一个示例工作流程:
设置virtualenv工作区,并进行版本跟踪:
mkdir /tmp/pip_uninstalling
cd /tmp/pip_uninstalling
virtualenv venv
. venv/bin/activate
初始化版本跟踪系统:
git init
echo venv > .gitignore
pip freeze > venv.pip
git add .gitignore venv.pip
git commit -m "Python project with venv"
安装具有依赖项的软件包,将其包含在需求文件中:
echo flask > requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip
现在开始构建您的应用程序,然后提交并启动一个新分支:
vim myapp.py
git commit -am "Simple flask application"
git checkout -b "experiments"
安装一个额外的软件包:
echo flask-script >> requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip
...玩,然后回到早期版本
vim manage.py
git commit -am "Playing with flask-script"
git checkout master
现在卸载无关的软件包:
pip freeze | grep -v -f venv.pip | xargs pip uninstall -y
我想可以使用git hooks自动执行该过程,但让我们别无所求。
当然,然后使用某些程序包缓存系统或本地存储库(如pip2pi)才有意义