在 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/python
和 bin/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 核心文件和标准库(加上 setuptools
和 pip
)被删除,而安装在 site-packages
中的自定义库被保留并工作,只要它们在纯 Python 中。二进制库可能需要也可能不需要重新安装才能正常运行。
这在 5 个安装了 Django 的虚拟环境中对我有用。
顺便说一句,如果 ./manage.py compilemessages
之后不起作用,试试这个:
brew install gettext && brew link gettext --force
【讨论】:
我必须删除的唯一文件是bin/python
文件。
对于一些旧版本的Python,需要删除setuptools
和pip
。
我还不得不删除 <EXISTING_ENV_PATH>/.Python
,因为这破坏了 virtualenv 的创建。
基于这个答案我写了一个小脚本(带有完整的归属):burgundywall.com/post/update-all-python-virtual-environments
您实际上可以通过运行 rmvirtualenv <env_name>
轻松删除您的虚拟环境,并将删除其所有内衬依赖项:) 查看更多信息: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的主要内容,如果未能解决你的问题,请参考以下文章