2012-04-18 262 views
115

有没有方法可以升级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怎么样?

+1

尽管您可能可以修改某些路径等以使其起作用。你想要的最后一件事情是与生产环境略有不同。试想一下,如果各个版本的编译方式之间还有一个区别,那么通过跟踪这个错误,您将会节省所有时间。我只是花时间创建一个全新的virtualenv并重新安装一切。 – sdolan 2012-06-15 22:10:26

+0

@Simon Walker。完全相同的问题。我必须升级python 3.5.3才能修正错误。 – 2017-07-19 09:54:51

回答

49

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

如果您的virtualenv安装了旧版本的python版本,并且升级您的virtualenv软件包不是一个选项,您可能需要阅读this以便安装带有所需python版本的virtualenv。

编辑

我测试过这种方法(即在旧的上面创建一个新的virtualenv的一个),它为我工作得很好。我认为如果你从python 2.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 )

+6

如果可能的话,他特别不想重新安装任何软件包。显然,如果你不知道为什么它很重要,你从来没有从源代码安装numpy;)提示:它需要一个LOOOOOOOOOOOOOONG时间。 – 2012-06-16 20:16:55

+0

是的,我明白这一点。但是,如果他在另一个之上制作虚拟技术,那么软件包不会丢失,所以他不必重新安装numpy或其他软件包。尽管如此,我认为他应该尝试这个新的虚拟世界以防万一失败。 – marianobianchi 2012-06-16 20:33:26

+0

我休息我的情况,我相信新的virtualenv版本确实就地升级,但是对于旧版本,他们甚至没有覆盖蟒蛇可执行文件,造成的问题与至少一个python的修正版。 – 2012-06-17 09:42:27

18

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

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

副作用:还当你升级Python来v2.7.8之后在虚拟环境中做import ssl修复Symbol not found: _SSLv2_method例外。

注:目前,这就是Python 2.7.x仅


如果您在OS X上使用自制的Python,第一deactivate所有的virtualenv,然后再升级的Python:

brew update && brew upgrade python 

运行以下命令(<EXISTING_ENV_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 

最后,重新创建您的虚拟环境:

virtualenv <EXISTING_ENV_PATH> 

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

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

顺便说一句,如果./manage.py compilemessages事后又没有工作,试试这个:

brew install gettext && brew link gettext --force 
+0

我必须删除的唯一文件是'bin/python'文件。 – 2016-09-26 22:21:52

+0

对于某些旧版本的Python,删除'setuptools'和'pip'是必要的。 – Rockallite 2016-09-26 23:02:55

+1

我也必须删除' /。Python',因为这破坏了virtualenv的创建。 – 2016-10-19 11:16:35

3

我没能在旧的上面创建一个新的virtualenv。但是pip中有工具可以使需求重新安装到全新的venv中快得多。 Pip可以将您的requirements.txt中的每个项目构建到wheel包中,并将其存储在本地缓存中。当您创建一个新的venv并在其中运行pip install时,如果找到它们,pip将自动使用预先构建的轮子。车轮安装比为每个模块运行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 

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

从那时起,任何时候我点子安装任何这些要求,它会从车轮安装它们,这很快。

+1

因为我觉得利用PIP机器做的工作是有意义的大多数人,但人谁定制自己的virtualenvs postactivate,predeactivate等,这是不是一个理想的选项,因为所有的丢失,必须手动读取。 – dpwrussell 2016-04-18 17:26:43

0

我感动我的家目录从一个MAC到另一个(山狮优胜美地)并没有意识到对破碎的virtualenv直到我失去了旧笔记本电脑的保持。我有virtualenv中指向的brew安装了Python 2.7,因为优山美地来与Python 2.7,我想更新我的virtualenv到系统蟒蛇。当我在现有目录之上运行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。

31

如果你碰巧使用Python自带3.3+的VENV模块,它支持--upgrade选项。 每docs

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

python3 -m venv --upgrade ENV_DIR 
+0

不幸的是,这在Ubuntu 16.04上不起作用,在那里他们打破了'venv'并拒绝修正它,因为“你可以使用virtualenv”。编辑:实际上,它确实工作!它也显示关于“ensurepip”的错误消息。 – rspeer 2017-05-18 20:01:43

+0

我在我的系统上将python从3.5.1升级到3.6.4。在我的virtualenv上升级python,我不得不在命令中明确地提到python3.6:'python3.6 -m venv --upgrade ' – 2018-01-04 18:34:31

+0

'--upgrade'标志在我的经验中是不必要的(3.5在Windows/Git Bash上为.2到3.5.4)。 – 2018-01-10 07:25:59

0

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

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

一些背景:

  • 我对Python的是3的一些项目是Python 2和一些工作;而我喜欢使用python3 -m venv,它不支持Python 2个的环境
  • 当我开始一个新项目,我用mkproject它创建虚拟环境,创建一个空的项目目录,和CD进去
  • 我想继续使用virtualenvwrapper的workon命令激活任何项目,不论Python版本

路线:

比方说,你现有的项目被命名为foo和当前正在运行的Python 2(mkproject -p python2 foo),虽然ŧ无论从2.x升级到3.x还是从3.6.0升级到3.6.1等,他的命令都是一样的。我还假设你目前在激活的虚拟环境中。

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

$ deactivate 
$ rmvirtualenv foo 

请注意,如果您已经添加任何自定义命令到挂钩(例如,bin/postactivate)你需要删除的环境之前,拯救那些。

2.藏匿在一个临时目录中的实际项目:

$ cd .. 
$ mv foo foo-tmp 

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

$ mkproject -p python3 foo 

4.更换所产生的空项目dir与​​实际项目,更改回项目目录:

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

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

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

如果这是一个常见的情况,我会考虑开一个公关添加类似$ upgradevirtualenv/$ upgradeproject到virtualenvwrapper。

0

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

当然你也可以用VENV升级为其他人指出VENV目录,但假定您已经升级了用于创建摆在首位的是VENV Python的。你不能升级到你的系统上没有的Python版本,所以一定要获得你想要的版本,首先,然后制作你想要的所有venvs。

0

在OS X或使用自制软件安装和升级Python3我不得不删除符号链接之前python -m venv --upgrade ENV_DIR会工作的MacOS。

我保存在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它给出了一个错误。最后,我刚从需求文件重新创建环境。