在virtualenv中升级python

有没有办法升级在virtualenv中使用的Python的版本(例如,如果一个错误修复发布出来)?

我可以pip freeze --local > requirements.txt然后删除目录和pip install -r requirements.txt但这需要大量的重新安装大型库,例如numpy,我用了很多。

我可以看到,从2.6 – > 2.7升级,这是一个优势,但2.7.x – > 2.7.y怎么样?

谢谢

你有看到这个吗? 如果我没有误解这个答案,你可以试着在旧的版本上创build一个新的virtualenv。 你只需要知道哪个python将使用你的virtualenv(你将需要看到你的virtualenv版本)。

如果你的virtualenv与旧版本的python版本一起安装,并且升级你的virtualenv软件包不是一个选项,你可能需要阅读这个文件 ,以便用你想要的python版本来安装virtualenv。

编辑

我已经testing了这个方法(在旧的方法上创build一个新的virtualenv),它对我来说工作的很好。 我认为如果你从python2.6更改为2.7或者2.7更改为3.x,你可能会遇到一些问题,但是如果你只是在同一个版本中升级(如果你想在2.7版本中升级),那么你不应该有任何问题,因为所有的包在两个python版本(2.7.x和2.7.y软件包在your_env / lib / python2.7 /中)保存在相同的文件夹中。

如果你改变了你的virtualenv python版本,你将需要再次安装所有你的软件包(或者把你需要的软件包链接到新版本的软件包文件夹,即:your_env / lib / python_newversion / site-packages)

再次更新:以下方法可能不适用于较新版本的virtualenv。 在尝试修改旧的virtualenv之前,应该将依赖项保存到需求文件( pip freeze > requirements.txt )中,并在其他地方对其进行备份。 如果出现任何问题,您仍然可以创build一个新的virtualenv并在其中安装旧的依赖项( pip install -r requirements.txt )。

更新:在我最初回答5个月后,我改变了答案。 以下方法更加方便和健壮。

副作用:它还修复了Symbol not found: _SSLv2_methodexception,当您将Python升级到v2.7.8后,在虚拟环境中import ssl时。

注意:目前, 这仅适用于Python 2.7.x。


如果你在OS X上使用Homebrew Python,首先deactivate所有的virtualenv,然后升级Python:

 brew update && brew upgrade python 

运行以下命令( <EXISTING_ENV_PATH>是您的虚拟环境的path):

 cd <EXISTING_ENV_PATH> rm .Python rm bin/pip{,2,2.7} rm bin/python{,2,2.7} rm -r include/python2.7 rm lib/python2.7/* rm -r lib/python2.7/distutils rm lib/python2.7/site-packages/easy_install.* rm -r lib/python2.7/site-packages/pip rm -r lib/python2.7/site-packages/pip-*.dist-info rm -r lib/python2.7/site-packages/setuptools rm -r lib/python2.7/site-packages/setuptools-*.dist-info 

最后,重新创build你的虚拟环境:

 virtualenv <EXISTING_ENV_PATH> 

通过这样做,旧的Python核心文件和标准库(以及setuptoolspip )将被删除,而site-packages中安装的自定义库一旦处于纯Python中,将被保留并运行。 二进制库可能需要或可能不需要重新安装以正常工作。

这在我安装了Django的5个虚拟环境中工作。

顺便说一句,如果./manage.py compilemessages之后不工作,试试这个:

 brew install gettext && brew link gettext --force 

如果碰巧使用Python 3.3+附带的venv模块,它支持–upgrade选项。 根据文档 :

假设Python已经就地升级,升级环境目录以使用这个版本的Python

 python3 -m venv --upgrade ENV_DIR 

我无法在旧版本上创build新的virtualenv。 但是有一些工具可以让需要重新安装到一个全新的venv中快得多。 Pip可以将您的requirements.txt中的每个项目构build到wheel包中,并将其存储在本地caching中。 当你创build一个新的venv并在其中运行pip安装时,如果发现它,pip将自动使用预先构build的轮子。 车轮安装比为每个模块运行setup.py要快得多。

我的〜/ .pip / pip.conf如下所示:

 [global] download-cache = /Users/me/.pip/download-cache find-links = /Users/me/.pip/wheels/ [wheel] wheel-dir = /Users/me/.pip/wheels 

我安装wheel( pip install wheel ),然后运行pip wheel -r requirements.txt 。 这将存放在我的pip.conf中的wheel-dir的内置轮子。

从那时起,任何时候我点上安装任何这些要求,它安装在轮子,这是非常快的。

我把我的主目录从一个mac移动到另一个(山狮到优胜美地),直到我失去了旧的笔记本电脑,才意识到这个破碎的virtualenv。 我有virtualenv指向由安装的Python 2.7和自Yosemite来与Python 2.7,我想更新我的virtualenv到系统python。 当我在现有目录上运行virtualenv时,出现OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'错误。 通过试验和错误,我解决了这个问题,删除了一些链接,并手动修复了一些。 这是我最后做的(类似于@Rockalite做的,但更简单):

 cd <virtualenv-root> rm lib/python2.7/config rm lib/python2.7/lib-dynload rm include/python2.7 rm .Python cd lib/python2.7 gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done 

之后,我可以在现有的目录之上运行virtualenv。

如何升级现有virtualenvwrapper项目的Python版本并保持相同的名称

我为Doug Hellmann出色的virtualenvwrapper专门添加了一个答案,因为现有的答案并不适合我。

一些背景:

  • 我从事一些Python 2和Python 3的项目, 而我很乐意使用python3 -m venv ,它不支持Python 2环境
  • 当我开始一个新的项目,我使用mkproject创build虚拟环境,创build一个空的项目目录,并在其中
  • 我想继续使用virtualenvwrapper的workon命令来激活任何项目,而不考虑Python版本

路线:

假设您的现有项目名为foo ,并且正在运行Python 2( mkproject -p python2 foo ),但是无论从2.x升级到3.x还是从3.6.0升级到3.6.1等,命令都是相同的。还假设你目前在激活的虚拟环境中。

1.closures并删除旧的虚拟环境:

 $ deactivate $ rmvirtualenv foo 

请注意,如果您已将任何自定义命令添加到钩子(例如, bin/postactivate ),则在删除环境之前,需要保存这些命令。

2.将实际项目存放在临时目录中:

 $ cd .. $ mv foo foo-tmp 

3.创build新的虚拟环境(和项目目录)并激活:

 $ mkproject -p python3 foo 

4.用实际项目replace空的生成项目目录,改回项目目录:

 $ cd .. $ mv -f foo-tmp foo $ cdproject 

5.重新安装依赖关系,确认新的Python版本等:

 $ pip install -r requirements.txt $ python --version 

如果这是一个常见的用例,我会考虑打开一个PR来添加一些像$ upgradevirtualenv / $ upgradeproject到virtualenvwrapper。

我只是想澄清,因为一些答案提到venv和其他人指的是virtualenv。 virtualenv支持使用-p或–python标志,但不支持venv。 如果您有多个Python版本,并且想要指定要创build哪个venv,请在命令行上执行,如下所示:malikarumi @ Tetuoan2:〜/ Projects $ python3.6 -m venv / path to pre-现有的目录,你想venv in

当然你也可以像其他人一样用venv升级,但是假设你已经升级了用于创buildvenv的Python。 你不能升级到你的系统上已经没有的Python版本,所以一定要获得你想要的版本,首先,然后让它从你想要的所有venvs。

在使用Homebrew安装和升级Python3的OS X或MacOS上,我不得不删除python -m venv --upgrade ENV_DIR之前的符号链接。

我在upgrade_python3.sh中保存了以下内容,所以我会记得从现在开始需要几个月的时间:

 brew upgrade python3 find ~/.virtualenvs/ -type l -delete find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \; 

更新:虽然这似乎起初运行良好,当我跑py.test它给了一个错误。 最后,我只是从需求文件重新创build环境。