【问题标题】:Upgrade python in a virtualenv在 virtualenv 中升级 python
【发布时间】: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?

标签: python pip virtualenv version requirements


【解决方案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
    

    取自:

    【讨论】:

      【解决方案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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-01-10
              • 1970-01-01
              • 2016-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-16
              相关资源
              最近更新 更多