如何在Heroku Cedar Stack上使用Virtualenv卸载pip安装的软件?

22

我尝试使用以下命令在Heroku上卸载一个模块:

heroku run bin/python bin/pip uninstall whatever

Pip在/app目录树中显示该模块,然后声称已卸载该模块,但再次运行相同的命令会在相同位置的/app目录树中显示其已安装。

是否有一种方法可以使pip卸载成功?


Heroku运行命令仅在新的dyno中运行指定的命令。Dynos是短暂的,这就是为什么pip卸载结果不会被保留。


你事先确认了源代码中的 activate 吗? - Drake Guan
4个回答

32
更新于2013-09-30:目前清除虚拟环境的方法似乎是在runtime.txt中指定不同的Python运行时版本如Github所述并在Heroku的devcenter参考中指定。
请注意,Heroku目前“仅支持和支持使用Python 2.7.4和3.3.2”,因此,除非您的应用程序同时支持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所解释的那样,您无法pip uninstall一个软件包,但可以清除并重新安装整个虚拟环境。使用CLEAN_VIRTUALENV optionuser-env-compile实验室功能来清除虚拟环境:
heroku labs:enable user-env-compile
heroku config:add CLEAN_VIRTUALENV=true

目前这个无法工作,因为存在一个错误。在此get fixed upstream(拉取请求已关闭)之前,您需要使用 my fork 的构建包:

heroku config:add BUILDPACK_URL=https://github.com/blaze33/heroku-buildpack-python.git

现在推送您的新代码,您会注意到整个虚拟环境都被重新安装了。
Andrey的答案自2012年3月23日起不再适用。新风格virtualenv提交将虚拟环境从/app移动到/app/.heroku/venv,但清除分支没有更新以跟上步伐,因此您最终得到一个不在PYTHONHOME中的虚拟环境。
为避免每次推送后重新安装所有内容,请禁用该选项:
heroku labs:disable user-env-compile
heroku config:remove CLEAN_VIRTUALENV BUILDPACK_URL

嗨@maximeR。你的解决方案令人印象深刻。运行得非常好。我不知道为什么只有我的投票。 - dani herrera
他的git url是错误的:git://github.com/blaze33/heroku-buildpack-python.git 是正确的。 - Bob Spryn
1
暂时看起来它可以工作了!看起来这个构建包已经被Heroku合并了。你只需要设置 heroku config:add CLEAN_VIRTUALENV=true - alanjds
这对我有用,但我们发现该应用程序是使用Python 2.7.2重新编译的,而我们使用的是Python 2.7.3。将运行时设置为“Jesse的答案对我有用...” - Nick
1
旧的构建包对我来说导致了错误。目前(仅)支持的解决方案是稍低下的Jesse提供的一个。但是,很快我们应该会有pip-tools 支持pip同步以便更好地处理这个问题。 - Rmatt
显示剩余5条评论

22
现在有一种更简单的方法来清除pip缓存。只需更改运行时环境,例如从“python-2.7.3”更改为“python-2.7.2”,反之亦然。
要做到这一点,请在存储库的根目录中添加一个名为runtime.txt的文件,其中仅包含运行时字符串(如上所示)。
为了使此功能正常工作,您需要打开Heroku实验室用户环境编译功能。请参见https://devcenter.heroku.com/articles/labs-user-env-compile

我已经验证了,目前这绝对有效 - 谢谢! - Jay Taylor
更改运行时是有效的。构建包方法对我不再起作用。 - Allan Lei

10

默认情况下,virtualenv 在部署之间被缓存。

为了避免包的缓存,您可以运行:

heroku config:add BUILDPACK_URL=git@github.com:heroku/heroku-buildpack-python.git#purge

这样,只要你推送了一些更改,所有东西都将从头开始构建。要启用缓存,只需删除BUILDPACK_URL配置变量即可。

现在卸载特定的软件包:

  1. requirements.txt中删除相应的记录;
  2. 提交并推送更改。

感谢Heroku支持团队的Lincoln进行澄清。


这个方法对我似乎不起作用。它对其他人还有效吗? - darko
这个网址对我不起作用。在“Maxime R”的答案中的网址已经起作用了。 - Nick

0

我为Maxime和Jesse的答案创建了一些fabfile配方,允许使用一个fab命令重新安装要求:https://gist.github.com/littlepea/5096814(查看docstrings以获取说明和示例)。

对于Maxime的答案,我创建了一个任务'heroku_clean'(或'hc'),它将类似于以下内容:

fab heroku_clean

或者使用别名并指定一个 Heroku 应用:

fab hc:app=myapp

为了Jesse的回答,我创建了一个名为'heroku_runtime'(或'hr')的任务,它设置了Heroku Python运行时并提交了runtime.txt文件(如果不存在,则创建它):
fab heroku_runtime:2.7.2

如果没有传递运行时版本,它将在2.7.2和2.7.3之间切换,因此最简单的更改和提交运行时的方法是:
fab hr

然后,您只需要部署(推送到Heroku源)应用程序,虚拟环境就会重新构建。我还添加了一个“heroku_deploy”任务(“hr”),用于Heroku推送和缩放,也可以与“heroku_runtime”任务一起使用。这是我首选的部署和重建虚拟环境的方法-一切都在一个命令中完成,我可以选择何时重建它,不像Maxime的答案建议那样每次都这样做,因为这可能需要很长时间:

fab hd:runtime=yes

这是一个等价于:

fab heroku_runtime
fab heroku_deploy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接