在virtualenv中升级python

Sim*_*ker 177 python pip version virtualenv

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

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

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

mar*_*chi 71

你看到吗?如果我没有误解这个答案,你可以尝试在旧答案之上创建一个新的virtualenv.你只需要知道哪个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)

  • 如果可能的话,他特别不想重新安装任何软件包.显然,如果你不知道为什么重要,你从来没有从源代码安装numpy;)提示:它需要一个LOOOOOOOOOOOOOOOO时间. (13认同)
  • 它对我不起作用,看起来不应该这样:https://github.com/pypa/virtualenv/issues/437 (4认同)
  • 我尝试在旧的“virtualenv”之上创建一个新的“virtualenv”,它确实有效。我确实必须指定 `-p` 将其指向正确的 python 版本。 (2认同)

小智 61

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

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

python3 -m venv --upgrade ENV_DIR
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,“bin/python”和“bin/python3”仍然链接到旧的“python3.4”二进制文件,我必须手动设置链接。另外,有没有办法_删除_现在过时的Python版本? (7认同)
  • 我在我的系统上将 python 从 3.5.1 升级到 3.6.4。为了在我的 virtualenv 上升级 python,我必须在命令中明确提到 python3.6:`python3.6 -m venv --upgrade <path_of_existing_env>` (5认同)
  • 我收到“错误:命令'['/ Users / me / Sites / site / venv3 / bin / python3','-Im','ensurepip','--upgrade','--default-pip']'返回非零退出状态1.`>是什么意思?我看不到任何活动的python进程,无法升级。 (3认同)

Roc*_*ite 23

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

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

副作用:这还修复了Symbol not found: _SSLv2_method异常,当你import ssl在一个虚拟的环境中升级Python来v2.7.8之后.

注意:目前,这是唯一的Python 2.7.x.


如果您在OS X上使用Homebrew Python,首先是deactivate所有virtualenv,然后升级Python:

brew update && brew upgrade python
Run Code Online (Sandbox Code Playgroud)

运行以下命令(<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
Run Code Online (Sandbox Code Playgroud)

最后,重新创建您的虚拟环境:

virtualenv <EXISTING_ENV_PATH>
Run Code Online (Sandbox Code Playgroud)

通过这样做,旧的Python核心文件和标准库(plus setuptoolspip)被删除,而安装的自定义库site-packages在纯Python中保留并正常工作.可能需要或可能不需要重新安装二进制库才能正常运行.

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

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

brew install gettext && brew link gettext --force
Run Code Online (Sandbox Code Playgroud)

  • 根据这个答案,我写了一个小脚本(完全归属):https://www.burgundywall.com/post/update-all-python-virtual-environments (2认同)

Gon*_*ica 13

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

1.备份venv要求(可选)

首先备份虚拟环境的要求:

pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old
Run Code Online (Sandbox Code Playgroud)

2.安装Python

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

curl https://pyenv.run | bash
Run Code Online (Sandbox Code Playgroud)

进而

exec $SHELL
Run Code Online (Sandbox Code Playgroud)

正如这里所建议的

如果,当一个人尝试更新时pyenv

pyenv update
Run Code Online (Sandbox Code Playgroud)

并且出现错误

bash: pyenv: command not found
Run Code Online (Sandbox Code Playgroud)

那是因为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
Run Code Online (Sandbox Code Playgroud)

然后重新启动外壳

exec "$SHELL"
Run Code Online (Sandbox Code Playgroud)

现在应该安装所需的 Python 版本。假设版本 3.8.3

pyenv install 3.8.3
Run Code Online (Sandbox Code Playgroud)

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

pyenv versions
Run Code Online (Sandbox Code Playgroud)

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

3. 创建新的虚拟环境

最后,安装新的Python版本后,创建一个新的虚拟环境(我们称之为venv

python3.8 -m venv venv
Run Code Online (Sandbox Code Playgroud)

激活它

source venv/bin/activate
Run Code Online (Sandbox Code Playgroud)

并安装要求

pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

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


use*_*966 11

第 1 步:冻结需求并备份现有环境

pip freeze > requirements.txt
deactivate
mv env env_old
Run Code Online (Sandbox Code Playgroud)

第 2 步:安装 Python 3.7 并激活虚拟环境

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version
Run Code Online (Sandbox Code Playgroud)

第 3 步:安装要求

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)


Mal*_*umi 7

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

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

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}
Run Code Online (Sandbox Code Playgroud)

您当然可以像其他人指出的那样进行升级,但这假设您已经升级了最初venv用于创建它的 Python 。venv您无法升级到系统上尚未安装的 Python 版本,因此请确保首先获取您想要的版本,然后从中创建您想要的所有 venv。


Rus*_*gan 5

我无法在旧的virtualenv之上创建一个新的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
Run Code Online (Sandbox Code Playgroud)

我安装wheel(pip install wheel),然后运行pip wheel -r requirements.txt.这将构建的轮子存储在我的pip.conf中的wheel-dir中.

从那时起,每当我点击安装任何这些要求时,它都会从车轮上安装它们,这非常快.

  • 对于大多数人来说,我认为使用 pip 机器来完成工作是有意义的,但对于任何自定义了 virtualenvs postactivate、predeactivate 等的人来说,这不是一个理想的选择,因为所有内容都会丢失并且必须手动读取。 (2认同)

Tay*_*ton 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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您已将任何自定义命令添加到了挂钩(例如bin/postactivate),则需要在删除环境之前保存这些自定义命令。

2.将实际项目存储在temp目录中:

$ cd ..
$ mv foo foo-tmp
Run Code Online (Sandbox Code Playgroud)

3.创建新的虚拟环境(和项目目录)并激活:

$ mkproject -p python3 foo
Run Code Online (Sandbox Code Playgroud)

4.用实际项目替换生成的空项目目录,改回项目目录:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject
Run Code Online (Sandbox Code Playgroud)

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

$ pip install -r requirements.txt
$ python --version
Run Code Online (Sandbox Code Playgroud)

如果这是一个常见的用例,我将考虑打开PR,为virtualenvwrapper 添加类似$ upgradevirtualenv/的内容$ upgradeproject

  • 是的,请。我完成了一半并遇到了重大问题......检查会很好,因为一旦删除第一步就不可逆转(据我目前所知) (2认同)