如何在Heroku Cedar堆栈中使用virtualenv卸载pip?
我试着在Heroku上卸载一个模块,使用的命令是:
heroku run bin/python bin/pip uninstall whatever
Pip显示这个模块在/app目录下,然后又说成功卸载了这个模块,但我再运行一遍同样的命令时,发现它还是在/app目录下。
有没有办法让pip的卸载成功呢?
Heroku的命令会启动一个新的“dyno”(相当于一个临时的运行环境),并只在这个dyno里执行指定的命令。因为这些dyno是临时的,所以pip卸载的结果不会被保存下来。
4 个回答
默认情况下,virtualenv 在每次部署之间会被缓存。
如果你想避免缓存包,可以运行:
heroku config:add BUILDPACK_URL=git@github.com:heroku/heroku-buildpack-python.git#purge
这样的话,每次你推送一些更改后,所有内容都会从头开始构建。如果想要启用缓存,只需删除 BUILDPACK_URL 配置变量。
现在来说说如何卸载特定的包:
- 从
requirements.txt
文件中删除相应的记录; - 提交并推送这些更改。
感谢 Heroku 支持团队的 Lincoln 提供的说明。
现在有一种更简单的方法来清理pip缓存。你只需要更改运行环境,比如把'python-2.7.3'改成'python-2.7.2',或者反过来。
要做到这一点,你需要在你的项目根目录下添加一个叫做runtime.txt的文件,这个文件里只写上你想要的运行环境字符串(就像上面提到的那样)。
为了让这个方法有效,你需要开启Heroku的labs用户环境编译功能。可以查看这个链接了解更多信息:https://devcenter.heroku.com/articles/labs-user-env-compile
更新于2013年9月30日: 现在清理虚拟环境的方法是,在 runtime.txt
文件中指定一个不同的Python运行版本,正如Github上所说,以及在Heroku的开发中心参考中提到的。
请注意,Heroku目前“只支持使用Python 2.7.4和3.3.2”,所以如果你的应用程序不同时支持这两个版本,你可能需要用你想切换到的运行时进行测试(目前可以在 http://envy-versions.s3.amazonaws.com/$PYTHON_VERSION.tar.bz2
找到,通常在大多数情况下,切换2.7.4和2.7.3之间不会有问题)。
感谢@Jesse提供的最新回答,以及那些让我意识到这个问题的评论者。
在2012年11月左右是最新的(自那以后我没有更新链接的构建包,我的拉取请求被关闭,CLEAN_VIRTUALENV功能在某个时候被官方构建包放弃了):
正如David所解释的,你不能单独卸载一个包,但你可以清除并重新安装整个虚拟环境。使用user-env-compile实验功能和CLEAN_VIRTUALENV选项来清除虚拟环境:
heroku labs:enable user-env-compile
heroku config:add CLEAN_VIRTUALENV=true
目前这不管用,因为有个bug。你需要使用我修改的构建包,直到这个在上游修复(拉取请求已关闭):
heroku config:add BUILDPACK_URL=https://github.com/blaze33/heroku-buildpack-python.git
现在推送你的新代码,你会发现整个虚拟环境被重新安装了。
自2012年3月23日起,Andrey的回答不再有效。新的虚拟环境提交将虚拟环境从/app移动到了/app/.heroku/venv,但清除分支没有更新,因此你会发现虚拟环境不在PYTHONHOME中。
为了避免每次推送后都重新安装所有内容,可以禁用该选项:
heroku labs:disable user-env-compile
heroku config:remove CLEAN_VIRTUALENV BUILDPACK_URL