在virtualenv中升级python

时间:2012-04-18 22:21:44

标签: python version virtualenv pip

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

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

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

13 个答案:

答案 0 :(得分:62)

您看到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)

答案 1 :(得分:48)

如果您正在使用Python 3.3+附带的venv模块,它支持--upgrade选项。 根据{{​​3}}:

  

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

python3 -m venv --upgrade ENV_DIR

答案 2 :(得分:22)

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

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

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

注意: 目前,仅适用于Python 2.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核心文件和标准库(加上setuptoolspip)将被删除,而site-packages中安装的自定义库将被保留并正常工作它们是纯Python。可能需要或可能不需要重新安装二进制库才能正常运行。

在安装了Django的5个虚拟环境中,这对我有用。

顺便说一句,如果./manage.py compilemessages之后无效,请尝试以下方法:

brew install gettext && brew link gettext --force

答案 3 :(得分:8)

步骤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

答案 4 :(得分:5)

我无法在旧版本之上创建一个新的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中。

从那时起,无论何时我都会安装这些要求,它会从车轮上安装它们,这非常快。

答案 5 :(得分:4)

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

我为使用Doug Hellmann优秀virtualenvwrapper的人添加了一个答案,因为现有的答案并没有为我做。

某些背景信息:

  • 我从事的是一些Python 2项目和一些Python 3项目。虽然我喜欢使用python3 -m venv,但它并不支持Python 2环境
  • 当我开始一个新项目时,我使用mkproject创建一个虚拟环境,创建一个空的项目目录,然后cds到它中
  • 我想继续使用virtualenvwrapper&#39; 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。用实际项目替换空生成的项目目录,改回项目目录:

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

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

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

如果这是一个常见用例,我会考虑打开一个公关,向virtualenvwrapper添加$ upgradevirtualenv / $ upgradeproject之类的内容。

答案 6 :(得分:1)

我将我的主目录从一个mac移动到另一个(Mountain Lion到Yosemite)并且没有意识到破坏了virtualenv,直到我丢失了旧笔记本电脑。我有brew安装的Python 2.7的virtualenv点,因为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。

答案 7 :(得分:1)

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

-p支持使用--pythonvirtualenv标记,但venv不支持使用。如果您有多个Python版本并且想要指定哪个创建venv,请在命令行中执行,如下所示:

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

您当然可以像其他人指出的那样使用venv升级,但这假设您已经升级了用于创建venv的Python。您无法升级到系统中已有的Python版本,因此请确保获得所需的版本,然后首先制作所需的所有版本。

答案 8 :(得分: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时它出错了。最后,我只是从需求文件中重新创建了环境。

答案 9 :(得分: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
>>>

答案 10 :(得分:0)

对于有问题的每个人

  

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

您必须安装python3.6-venv

 sudo apt-get install python3.6-venv

答案 11 :(得分:0)

答案 12 :(得分:0)

让我们考虑一个要更新的环境,其名称为venv

1。备份venv要求(可选)

首先,备份虚拟环境的需求:

pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old

2。安装Python

假设没有sudo访问权限,pyenv是安装Python的可靠且快速的方法。为此,应该运行

$ curl https://pyenv.run | bash

然后

$ exec $SHELL

it is suggested here

如果,当您尝试更新pyenv

pyenv update

一个错误

bash: pyenv: command not found

这是因为pyenv路径未导出到.bashrc。可以通过执行以下命令来解决:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

然后重新启动外壳程序

exec "$SHELL"

现在应该安装一个想要的Python版本。假设版本3.8.3

pyenv install 3.8.3

可以通过运行来确认是否已正确安装

pyenv versions

输出应为位置和版本(在本例中为3.8.3)

3。创建新的虚拟环境

最后,在安装了新的Python版本之后,创建一个新的虚拟环境(我们将其命名为venv

python3.8 -m venv venv

激活

source venv/bin/activate

并安装要求

pip install -r requirements.txt

现在应该在新环境中启动并运行