在virtualenv中升级python

290 人关注

是否有办法升级虚拟环境中使用的python版本(例如,如果有bugfix版本出现)?

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

I can see this is an advantage when upgrading from, e.g., 2.6 -> 2.7, but what about 2.7.x -> 2.7.y?

2 个评论
虽然你可能会修改一些路径等来让它工作。 你最不希望看到的是一个与生产环境略有不同的环境。 想想看......如果不同版本的编译方式之间有哪怕一个差异,你就会失去通过追踪错误而节省的所有时间。 我只会花时间创建一个全新的虚拟环境并重新安装一切。
@Simon Walker. 完全一样的问题。我不得不升级Python 3.5.3,以修复一个错误。
python
pip
virtualenv
version
requirements
Simon Walker
Simon Walker
发布于 2012-04-19
13 个回答
CoupleWavyLines
CoupleWavyLines
发布于 2018-11-23
已采纳
0 人赞同

如果你碰巧使用Python 3.3以上版本的venv模块,它支持一个 --upgrade 选项。 根据 docs :

升级环境目录以使用这个版本的Python,假设Python已经被就地升级了

python3 -m venv --upgrade ENV_DIR
    
我把我的系统上的python从3.5.1升级到3.6.4。为了在我的virtualenv上升级python,我必须在命令中明确提到python3.6。【替换代码0
根据我的经验(在Windows/Git Bash上的3.5.2到3.5.4), --upgrade 标记是不必要的。
Jens
在我的例子中, bin/python bin/python3 仍然链接到旧的 python3.4 二进制,我不得不手动设置链接。另外,是否有一种方法可以 remove 现在已经过时的Python版本?
I got Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1. > what does it mean ? I see no active python processes, cannot upgrade.
@user305883 在我把我的系统Python版本从3.5升级到3.6(并删除了3.5)之后,我也得到了一个类似的错误。 我不得不重新安装3.5,并运行 python3.6 -m venv --upgrade ENV_DIR 才得以工作。 我想我还是要在 ENV_DIR/bin 中更新一些符号链接。 因此,诀窍是用 new 在旧版本仍被安装的情况下,Python的版本。
marianobianchi
marianobianchi
发布于 2018-11-23
0 人赞同

Did you see this ?如果我没有误解你的回答,你可以尝试在旧的虚拟环境上创建一个新的虚拟环境。你只需要知道哪个Python将使用你的virtualenv(你需要看到你的virtualenv版本)。

如果你的virtualenv安装的python版本与旧版本相同,并且升级virtualenv包不是一个选项,你可能需要阅读 this 以便安装一个带有你想要的python版本的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;)提示:这需要很长的时间。
是的,我明白这一点。但似乎如果他在另一个virtualenv之上做一个virtualenv,软件包就不会丢失,所以他不必重新安装numpy或任何其他软件包。尽管如此,我认为他应该在一个新的virtualenv中进行尝试,以防失败。
我重申我的观点,我相信新的virtualenv版本确实在原地升级,然而对于旧的版本,它们甚至没有覆盖python可执行文件,这至少在一个python错误修复版本中造成了问题。
它对我不起作用,看起来它不应该起作用。 github.com/pypa/virtualenv/issues/437
我试图在旧的基础上创建一个新的 virtualenv ,结果它 did 工作。我确实不得不指定 -p ,以便将其指向正确的python版本。
Rockallite
Rockallite
发布于 2018-11-23
0 人赞同

再次更新。 下面的方法可能在较新版本的virtualenv中不起作用。在你尝试对旧的virtualenv进行修改之前,你应该把依赖关系保存在一个需求文件中( pip freeze > requirements.txt ),并在其他地方做一个备份。如果出了什么问题,你仍然可以创建一个新的virtualenv并在其中安装旧的依赖项( pip install -r requirements.txt )。

已更新。 在我最初回答的5个月后,我改变了答案。下面的方法更加方便和稳健。

Side effect: 它还修复了当你将 Python 升级到 v2.7.8 之后在虚拟环境中进行 Symbol not found: _SSLv2_method 的异常。

Notice: Currently, this is for Python 2.7.x only .

如果你在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核心文件和标准库(加上setuptoolspip)被删除,而在site-packages中安装的自定义库被保留下来并工作,只要它们是纯Python。二进制库可能需要也可能不需要重新安装以正常工作。

这对我来说在5个安装了Django的虚拟环境中都是有效的。

BTW,如果./manage.py compilemessages之后不工作了,可以试试这个。

brew install gettext && brew link gettext --force
    
我不得不删除的唯一文件是 bin/python 文件。
对于一些老版本的Python,删除 setuptools pip 是必要的。
我还不得不删除 <EXISTING_ENV_PATH>/.Python ,因为这破坏了virtualenv的创建。
Kurt
根据这个答案,我写了一个小脚本(完全归属)。 burgundywall.com/post/update all-python-virtual-environments
实际上,你可以通过运行 rmvirtualenv <env_name> 轻松地删除你的虚拟环境,并将删除其所有内含的依赖关系:) 更多信息请见。 virtualenvwrapper.readthedocs.io/en/latest/...
user3785966
user3785966
发布于 2018-11-23
0 人赞同

Step 1: Freeze requirement & take a back-up of existing env

pip freeze > requirements.txt
deactivate
mv env env_old

Step 2: Install Python 3.7 & activate virutal environment

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

Step 3:安装要求

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt
    
Taylor D. Edmiston
Taylor D. Edmiston
发布于 2018-11-23
0 人赞同

How to upgrade the Python version for an existing 虛擬虛擬實境(virtualenvwrapper) project and keep the same name

我为使用道格-赫尔曼(Doug Hellmann)的优秀作品的人补充一个答案 虛擬虛擬實境(virtualenvwrapper) 特别是由于现有的答案并不适合我。

Some context:

  • I work on some projects that are Python 2 and some that are Python 3; while I'd love to use python3 -m venv , it doesn't support Python 2 environments
  • When I start a new project, I use mkproject which creates the virtual environment, creates an empty project directory, and cds into it
  • I want to continue using 虛擬虛擬實境(virtualenvwrapper)'s workon command to activate any project irrespective of Python version
  • Directions:

    假设你现有的项目名为 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.创建新的虚拟环境(和项目dir)并激活。

    $ mkproject -p python3 foo
    

    4.用真实的项目替换空的生成的项目目录,再改回项目目录。

    $ cd ..
    $ mv -f foo-tmp foo
    $ cdproject
    

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

    $ pip install -r requirements.txt
    $ python --version
    

    If this is a common use case, I'll consider opening a PR to add something like $ upgradevirtualenv / $ upgradeproject to 虛擬虛擬實境(virtualenvwrapper).

    是的,请。 我做了一半就遇到了大问题...... 如果有检查就好了,因为第一步一旦删除就不可逆转了(就我目前所知)。
    我发现有必要为我的Python版本安装distutils,以确保新的mkvirtualenv命令能够无误运行:sudo apt-get install python3.10-distutils
    Gonçalo Peres
    Gonçalo Peres
    发布于 2018-11-23
    0 人赞同

    让我们考虑一下,人们想要更新的环境的名称是 venv

    1.备份风险要求 (可选)

    首先,备份虚拟环境的要求。

    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
    

    然后重新启动外壳

    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
    

    现在,人们应该在新的环境中启动和运行。

    Russ Egan
    Russ Egan
    发布于 2018-11-23
    0 人赞同

    我无法在旧的virtualenv上面创建一个新的virtualenv。 但是pip中的一些工具可以让你更快地将需求重新安装到一个全新的venv中。 Pip可以将requirements.txt中的每一个项目建立成一个轮子包,并将其存储在本地缓存中。 当你创建一个新的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
    

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

    从那时起,任何时候我的管道安装任何这些要求,它都会从车轮上安装,这相当快。

    dpwr
    对于大多数人来说,我认为利用pip机械来完成工作是有意义的,但对于那些已经定制了virtualenvs的postactivate、predeactivate等的人来说,这不是一个理想的选择,因为所有这些都会丢失,必须要手动重新输入。
    Malik A. Rumi
    Malik A. Rumi
    发布于 2018-11-23
    0 人赞同

    我只是想澄清一下,因为有些答案是指 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版本,所以要确保首先得到你想要的版本,然后从它那里制作你想要的所有venvs。

    0 人赞同

    这种方法对我来说总是有效的。

    # 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
  • David Moles
    David Moles
    发布于 2018-11-23
    0 人赞同

    如果你使用的是 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
        
    棒极了!谢谢你给我这个礼物
    Jens
    You refer to this pipenv ?
    Jeff C Johnson
    Jeff C Johnson
    发布于 2018-11-23
    0 人赞同

    在OS X或macOS上使用Homebrew安装和升级Python3,我不得不在 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时,却出现了错误。 最后我只是从一个需求文件中重新创建了环境。

    替换代码0】不工作,因为`~/.virtualenvs/myenv/bin/python3.7不是一个符号链接,所以不会被更新。
    实际上,问题是有 ~/.virtualenvs/myenv/.Python ,这是一个符号链接。
    JanL
    JanL
    发布于 2018-11-23
    0 人赞同

    For everyone with the problem

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