在 virtualenv 中升级 python

Posted

技术标签:

【中文标题】在 virtualenv 中升级 python【英文标题】:Upgrade python in a virtualenv 【发布时间】:2012-04-30 10:17:12 【问题描述】:

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

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

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

【问题讨论】:

虽然您可以修改一些路径等以使其正常工作。您想要的最后一件事是与生产环境略有不同。试想一下.. 如果各个版本的编译方式之间甚至存在一点差异,那么您将通过跟踪错误来节省所有时间。我只是花时间创建一个全新的 virtualenv 并重新安装所有内容。 @Simon Walker。完全相同的问题。我必须升级 python 3.5.3 才能修复错误。 这能回答你的问题吗? Can existing virtualenv be upgraded gracefully? 【参考方案1】:

如果您碰巧使用 Python 3.3+ 附带的 venv 模块,它支持--upgrade 选项。 根据docs:

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

python3 -m venv --upgrade ENV_DIR

【讨论】:

不幸的是,这在 Ubuntu 16.04 上不起作用,他们破坏了 venv 并拒绝修复它,理由是“你可以只使用 virtualenv”。编辑:实际上,它确实有效!它还只是显示一条关于“ensurepip”的错误消息。 我在我的系统上将 python 从 3.5.1 升级到了 3.6.4。为了在我的 virtualenv 上升级 python,我必须在命令中明确提到 python3.6:python3.6 -m venv --upgrade <path_of_existing_env> 就我而言,bin/pythonbin/python3 仍然链接到旧的 python3.4 二进制文件,我必须手动设置链接。另外,有没有办法删除现在过时的python版本? 我收到了Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1. > 这是什么意思?我没有看到活动的 python 进程,无法升级。 @user305883 在将系统 Python 版本从 3.5 升级到 3.6(并删除 3.5)后,我遇到了类似的错误。我必须重新安装 3.5 并运行 python3.6 -m venv --upgrade ENV_DIR 才能正常工作。我想我仍然需要更新ENV_DIR/bin 中的一些符号链接。因此,诀窍是在仍安装旧版本的同时使用 new Python 版本进行更新。【参考方案2】:

你看到this了吗?如果我没有误解那个答案,您可以尝试在旧的虚拟环境之上创建一个新的虚拟环境。您只需要知道哪个 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)

【讨论】:

如果可能的话,他特别不想重新安装任何软件包。显然,如果您不知道为什么重要,您从未从源代码安装 numpy ;) 提示:这需要 LOOOOOOOOOOOOOONG 时间。 是的,我明白这一点。但似乎如果他在另一个之上创建一个 virtualenv,包不会丢失,所以他不必重新安装 numpy 或任何其他包。不过,我认为他应该在新的 virtualenv 中尝试这个,以防万一失败。 我相信我的情况,我相信新的 virtualenv 版本确实升级到位,但是对于旧版本,它们甚至没有覆盖 python 可执行文件,这导致至少一个 python 错误修复版本出现问题. 它对我不起作用,看起来不应该:github.com/pypa/virtualenv/issues/437 我尝试在旧的virtualenv 之上创建一个新的virtualenv,它确实工作了。我确实必须指定-p 以将其指向正确的python 版本。【参考方案3】:

再次更新: 以下方法可能不适用于较新版本的 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 上使用 Homebrew Python,首先deactivate all 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

【讨论】:

我必须删除的唯一文件是 bin/python 文件。 对于一些旧版本的Python,需要删除setuptoolspip 我还不得不删除 &lt;EXISTING_ENV_PATH&gt;/.Python,因为这破坏了 virtualenv 的创建。 基于这个答案我写了一个小脚本(带有完整的归属):burgundywall.com/post/update-all-python-virtual-environments 您实际上可以通过运行 rmvirtualenv &lt;env_name&gt; 轻松删除您的虚拟环境,并将删除其所有内衬依赖项:) 查看更多信息:virtualenvwrapper.readthedocs.io/en/latest/…【参考方案4】:

第 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

【讨论】:

【参考方案5】:

如何为现有的 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。将真实项目存放在临时目录中:

$ 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。

【讨论】:

是的,请。我完成了一半并遇到了重大问题......检查会很好,因为第一步一旦删除就不可逆转(据我目前的知识)【参考方案6】:

我无法在旧虚拟环境之上创建新的虚拟环境。但是 pip 中有一些工具可以更快地将需求重新安装到全新的 venv 中。 Pip 可以将您的 requirements.txt 中的每个项目构建到一个 wheel 包中,并将其存储在本地缓存中。当您创建一个新的 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 任何这些要求时,它都会从***上安装它们,这非常快。

【讨论】:

对于大多数人来说,我认为使用 pip 机器来完成这项工作是有意义的,但对于任何定制了他们的 virtualenvs 后激活、预停用等的人来说,这不是一个理想的选择,因为所有这些都丢失了并且必须手动读取。【参考方案7】:

这种方法对我总是有效的:

# 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

取自:

https://github.com/1st/python-on-osx#python-virtualenv https://gist.github.com/1st/ced02a1c64ac7b82bb27e432eea6b068

【讨论】:

【参考方案8】:

如果您使用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
>>>

【讨论】:

太棒了!感谢这个宝石 你指的是this pipenv?【参考方案9】:

我只是想澄清一下,因为一些答案指的是venv,而另一些答案指的是virtualenv

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

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

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

【讨论】:

【参考方案10】:

假设我们要更新的环境名称为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

然后重启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

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

在使用 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这是一个符号链接。【参考方案13】:

对于所有有问题的人

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

你必须安装python3.6-venv

 sudo apt-get install python3.6-venv

【讨论】:

以上是关于在 virtualenv 中升级 python的主要内容,如果未能解决你的问题,请参考以下文章

Virtualenv开发文档

在 virtualenv 中控制 pip 版本

VirtualEnv在Windows cmd中未显示

python virtualenv

python的virtualenv环境安装

如何从我的虚拟环境中更新/升级 pip 本身?