在virtualenv中升级python


206

有没有一种方法可以升级virtualenv中使用的python版本(例如,如果出现错误修复版本)?

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

我可以看到从2.6-> 2.7升级时这是一个优势,但是2.7.x-> 2.7.y呢?


2
虽然您可以修改某些路径等以使其正常工作。您想要的最后一件事是与生产环境稍有不同。只是想想..如果各个版本的编译方式之间甚至没有任何区别,那么您将浪费大量时间来跟踪该错误。我只是花时间创建一个全新的virtualenv并重新安装所有内容。
山姆·多兰

@西蒙·沃克 完全一样的问题。我必须升级python 3.5.3才能修复错误。
Mohammed Shareef C

Answers:


77

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

如果您的virtualenv安装了与旧版本相同的python版本,并且无法升级virtualenv软件包,则可能需要阅读此内容,以便使用所需的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版本,则需要再次安装该版本的所有软件包(或仅将所需的软件包链接到新版本的packages文件夹中,即:your_env / lib / python_newversion / site-packages)


13
他特别不想尽可能重新安装任何软件包。显然,如果您不知道为什么这样做,从没安装过numpy;)提示:这需要花很长时间。
Antti Haapala 2012年

是的,我明白。但是看来,如果他在其他虚拟机之上创建virtualenv,则软件包不会丢失,因此他不必重新安装numpy或任何其他软件包。尽管如此,我认为他应该在新的virtualenv中尝试这样做,以防失败。
marianobianchi 2012年

顺便说一下,我相信新的virtualenv版本确实可以升级,但是对于旧版本,它们甚至都没有覆盖python可执行文件,这至少导致了一个python bugfix版本的问题。
Antti Haapala 2012年

4
它对我不起作用,似乎不应该:github.com/pypa/virtualenv/issues/437
Kentzo

1
我试图virtualenv在旧版本的基础上创建一个新版本,它确实起作用了。我确实必须指定-p将其指向正确的python版本。
osa

76

如果您恰巧使用的是Python 3.3+随附的venv模块,则它支持一个--upgrade选项。根据文档

假设Python已就地升级,请升级环境目录以使用此版本的Python

python3 -m venv --upgrade ENV_DIR

1
不幸的是,这在Ubuntu 16.04上不起作用,他们在Ubuntu 16.04上中断venv并拒绝以“您可以使用virtualenv”为基础对其进行修复。编辑:实际上,它确实有效!它也仅显示有关“ ensurepip”的错误消息。
rspeer

2
我在系统上将python从3.5.1升级到3.6.4。要在我的virtualenv上升级python,我必须在命令中明确提及python3.6:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed

1
在我的情况,bin/pythonbin/python3依然与老的python3.4二进制文件,我不得不手动设置链接。另外,有没有办法删除现在过时的python版本?
詹斯

4
我知道Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.>这是什么意思?我看不到任何活动的python进程,无法升级。
user305883

1
@ user305883我将系统Python版本从3.5升级到3.6(并删除了3.5)后,我遇到了类似的错误。我必须重新安装3.5并运行python3.6 -m venv --upgrade ENV_DIR才能正常工作。我认为我仍然需要更新中的一些符号链接ENV_DIR/bin。因此,诀窍是在仍然安装旧版本的同时使用新的 Python版本进行更新。
AstroFloyd

24

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

更新:我最初回答5个月后就更改了答案。以下方法更方便,更可靠。

副作用:在将Python升级到v2.7.8之后在虚拟环境中Symbol not found: _SSLv2_method执行操作时,它还修复了异常import ssl

注意:目前,这仅适用于Python2.7.x


如果您在OS X上使用Homebrew 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核心文件和标准库(plus setuptoolspip)就被删除,而安装在其中的自定义库site-packages则在纯Python 中被保留并正常工作。二进制库可能需要也可能不需要重新安装才能正常运行。

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

顺便说一句,如果./manage.py compilemessages之后仍然无法使用,请尝试以下操作:

brew install gettext && brew link gettext --force

我唯一要删除的bin/python文件是文件。
科恩

对于某些旧版本的Python,必须删除setuptoolspip
Rockallite

1
我还必须删除,<EXISTING_ENV_PATH>/.Python因为这破坏了virtualenv的创建。
Kiran Jonnalagadda

2
基于此答案,我写了一个小脚本(具有完整的署名):burgundywall.com/post/update-all-python-virtual-environments
Kurt

实际上,你可以很容易地通过运行删除您的虚拟环境rmvirtualenv <env_name>,并会删除其所有内衬的依赖:)多见于:virtualenvwrapper.readthedocs.io/en/latest/...
尼克·卢卡斯

7

我无法在旧版本的基础上创建新的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

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

从那时起,每当我点安装这些要求中的任何一个时,它都会从轮子上安装它们,这非常快。


1
我认为对于大多数人来说,利用pip机制进行工作是有意义的,但是对于自定义其virtualenvs后激活,预激活等功能的任何人来说,这都不是理想的选择,因为所有这些东西都丢失了,必须手动读取。
dpwrussell '16

6

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

我要为使用Doug Hellmann出色的virtualenvwrapper的任何人添加一个答案,特别是因为现有的答案对我没有帮助。

一些背景:

  • 我从事一些Python 2项目和Python 3项目;虽然我想使用python3 -m venv它,但它不支持Python 2环境
  • 当我开始一个新项目时,我使用mkproject它来创建虚拟环境,创建一个空项目目录,并在其中进行cds
  • 我想继续使用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.将实际项目存储在temp目录中:

$ cd ..
$ mv foo foo-tmp

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

$ mkproject -p python3 foo

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

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

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

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

如果这是一个常见的用例,我将考虑打开PR,为virtualenvwrapper 添加类似$ upgradevirtualenv/的内容$ upgradeproject


1
是的,请。我走了一半,遇到了主要问题……检查将很不错,因为第一步一旦删除就无法恢复(据我所知)
chris Frisina

2

这种方法总是对我有用:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

取自:


1

我将主目录从一台Mac移到了另一台(Mountain Lion到优胜美地),直到我失去了旧笔记本电脑的机会,才意识到虚拟机损坏了。brew自从Yosemite随附Python 2.7以来,我已经安装了指向Python 2.7的virtualenv点,因此我想将我的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了。


1

在使用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时却出现了错误。最后,我只是从需求文件中重新创建了环境。


py.test不起作用,因为`〜/ .virtualenvs / myenv / bin / python3.7不是符号链接,因此不会更新。

啊,实际上,问题是存在~/.virtualenvs/myenv/.Python一个符号链接。
灰柏林-泰勒

1

如果您使用pipenv,我不知道是否可以在适当的位置升级环境,但是至少对于次要版本升级来说,它似乎足够聪明,在创建新环境时不从头开始重建软件包。例如,从3.6.4到3.6.5:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a virtualenv for this project
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv
Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47  00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

太棒了!感谢您的珍宝
Mayur Patil

1

我只想澄清一下,因为有些答案是指venv,有些则是指virtualenv

在上支持使用-p--python标志virtualenv,但不支持venv。如果您有多个Python版本,并且想要指定使用哪个版本创建venv,请在命令行上执行以下操作:

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

当然,您也可以venv像其他人指出的那样进行升级,但是前提是您已经升级了最初用于创建该Python的Python venv。您无法升级到系统上某个地方尚未拥有的Python版本,因此请确保首先获取所需的版本,然后再从中获取所需的所有Venv。


1

步骤1:冻结要求并备份现有环境

pip freeze > requirements.txt
deactivate
mv env env_old

步骤2:安装Python 3.7并激活虚拟环境

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

步骤3:安装需求

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

0

对于有问题的每个人

错误:命令'['/ Users / me / Sites / site / venv3 / bin / python3','-Im','ensurepip','-upgrade','-default-pip']'返回非零退出状态1。

您必须安装python3.6-venv

 sudo apt-get install python3.6-venv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.