259

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

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

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

4

13 回答 13

130

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

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

python3 -m venv --upgrade ENV_DIR
于 2017-02-23T01:48:39.427 回答
90

你看到这个了吗?如果我没有误解那个答案,您可以尝试在旧的虚拟环境之上创建一个新的虚拟环境。您只需要知道哪个 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 版本,您将需要为该版本再次安装所有软件包(或者只需将您需要的软件包链接到新版本的软件包文件夹中,即:your_env/lib/python_newversion/site-packages)

于 2012-06-16T02:11:04.530 回答
25

再次更新: 以下方法可能不适用于较新版本的 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 核心文件和标准库(加号setuptools和 二进制库可能需要也可能不需要重新安装才能正常运行。pipsite-packages

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

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

brew install gettext && brew link gettext --force
于 2014-07-13T15:36:51.467 回答
17

第 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
于 2020-03-15T07:41:45.027 回答
9

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

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

一些上下文:

  • 我从事一些 Python 2 项目和一些 Python 3 项目。虽然我很想使用python3 -m venv,但它不支持 Python 2 环境
  • 当我开始一个新项目时,我使用mkprojectwhich 创建虚拟环境,创建一个空的项目目录,然后 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. 将真实项目存放在临时目录中:

$ 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 以将$ upgradevirtualenv/之类的内容添加$ upgradeproject到 virtualenvwrapper。

于 2017-06-10T19:50:05.677 回答
7

我无法在旧虚拟环境之上创建新的虚拟环境。但是 pip 中有一些工具可以更快地将需求重新安装到全新的 venv 中。Pip 可以将您的 requirements.txt 中的每个项目构建到一个轮子包中,并将其存储在本地缓存中。当您创建一个新的 venv 并在其中运行 pip install 时,如果 pip 找到它们,它将自动使用预构建的轮子。Wheels 的安装速度比为每个模块运行 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 中。

从那时起,每当我 pip install 任何这些要求时,它都会从轮子上安装它们,这非常快。

于 2014-10-21T11:22:37.937 回答
3

这种方法总是对我有用:

# 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

摘自:

于 2019-10-02T18:36:20.590 回答
3

让我们考虑一个想要更新的环境有名称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

正如这里所建议的那样

如果,当一个人试图更新 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

然后重启shell

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

现在应该在一个新的环境中启动并运行。

于 2020-11-16T17:49:19.023 回答
2

如果您正在使用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
>>>
于 2018-04-09T17:02:46.307 回答
2

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

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

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

正如其他人所指出的那样,您当然可以升级venv,但这假设您已经升级了最初用于创建它的 Python venv。您无法升级到系统上某个地方还没有的 Python 版本,因此请确保首先获得您想要的版本,然后从中制作您想要的所有 venv。

于 2017-07-20T19:00:16.243 回答
1

我将我的主目录从一台 mac 移动到另一台(Mountain Lion 到 Yosemite),直到我失去了旧笔记本电脑时才意识到损坏的 virtualenv。我安装了指向 Python 2.7 的 virtualenv 点,brew并且由于 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。

于 2015-06-17T09:32:35.247 回答
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 时,它给出了一个错误。最后,我只是从需求文件中重新创建了环境。

于 2017-10-20T15:25:07.380 回答
0

对于每个有问题的人

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

你必须安装 python3.6-venv

 sudo apt-get install python3.6-venv
于 2018-11-23T11:44:49.943 回答