有没有办法升级 virtualenv 中使用的 python 版本(例如,如果出现错误修复版本)?
我可以pip freeze --local > requirements.txt
,然后删除目录 and pip install -r requirements.txt
,但这需要大量重新安装大型库,例如,numpy
我经常使用的。
从例如 2.6 -> 2.7 升级时,我可以看到这是一个优势,但是 2.7.x -> 2.7.y 呢?
有没有办法升级 virtualenv 中使用的 python 版本(例如,如果出现错误修复版本)?
我可以pip freeze --local > requirements.txt
,然后删除目录 and pip install -r requirements.txt
,但这需要大量重新安装大型库,例如,numpy
我经常使用的。
从例如 2.6 -> 2.7 升级时,我可以看到这是一个优势,但是 2.7.x -> 2.7.y 呢?
如果您碰巧使用的是 Python 3.3+ 附带的 venv 模块,它支持一个--upgrade
选项。根据文档:
升级环境目录以使用此版本的 Python,假设 Python 已就地升级
python3 -m venv --upgrade ENV_DIR
你看到这个了吗?如果我没有误解那个答案,您可以尝试在旧的虚拟环境之上创建一个新的虚拟环境。您只需要知道哪个 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)
再次更新:
以下方法可能不适用于较新版本的 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
和 二进制库可能需要也可能不需要重新安装才能正常运行。pip
site-packages
这在 5 个安装了 Django 的虚拟环境中对我有用。
顺便说一句,如果./manage.py compilemessages
之后不工作,试试这个:
brew install gettext && brew link gettext --force
第 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
我正在为任何使用 Doug Hellmann 出色的virtualenvwrapper的人添加一个答案,因为现有的答案对我没有帮助。
一些上下文:
python3 -m venv
,但它不支持 Python 2 环境mkproject
which 创建虚拟环境,创建一个空的项目目录,然后 cds 进入它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。
我无法在旧虚拟环境之上创建新的虚拟环境。但是 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 任何这些要求时,它都会从轮子上安装它们,这非常快。
这种方法总是对我有用:
# 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
摘自:
让我们考虑一个想要更新的环境有名称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
现在应该在一个新的环境中启动并运行。
如果您正在使用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
>>>
我只是想澄清一下,因为有些答案是指venv
,有些是指virtualenv
.
在 上支持使用-p
or--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。
我将我的主目录从一台 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。
在使用 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 时,它给出了一个错误。最后,我只是从需求文件中重新创建了环境。
对于每个有问题的人
错误:命令 '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' 返回非零退出状态 1。
你必须安装 python3.6-venv
sudo apt-get install python3.6-venv