【问题标题】:Using different versions of python with virtualenvwrapper将不同版本的 python 与 virtualenvwrapper 一起使用
【发布时间】:2011-09-18 02:52:38
【问题描述】:

我使用 Macports 在我的 Mac 上安装了各种版本的 python。当我通过$ port select python python27 选择python 2.7 时,virtualenvwrapper 可以完美运行。

但是如果我选择另一个版本的 python,即 2.6,virtualenvwrapper 会生成错误消息:ImportError: No module named virtualenvwrapper.hook_loader

我检查了我的 .profile 并将 VIRTUALENVWRAPPER_PYTHON 设置为 /opt/local/bin/python,所以在我看来,无论我选择了哪个 python,virtualenvwrapper 都应该工作。

知道什么会导致 virtualenvwrapper 在我切换 python 版本时生成 .hook_loader 错误吗?

【问题讨论】:

  • 不经过port select ... 并坚持使用您的基本2.7,只运行mkvirtualenv --python /path/to/python2.6 是否有效?它应该自动切换到正确的解释器(并设置环境)。在我的系统上(使用自制软件设置),mkvirtualenv -p python2.6 工作正常。
  • 我没有收到 hook_loader 错误,但它抱怨缺少 DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 使用解释器运行 virtualenv /opt/local/bin/ python2.7 你必须提供一个DEST_DIR
  • 哎呀,对不起——遗漏了关键论点!那应该是mkvirtualenv --python /path/to/python2.6 env_name。 mkvirtualenv 在您的$WORKON_HOME 中创建一个名为“env_name”的文件夹,该文件夹作为 DEST_DIR 参数传递给 virtualenv。如果不指定名称,就很难确定在哪里进行设置,这是肯定的。
  • 呃。我应该抓住它。是的,这行得通。猜猜答案是将端口选择留给 python27 并在我需要使用其他东西时使用 --python 标志运行 mkvirtualenv。

标签: python virtualenvwrapper


【解决方案1】:

你可以明确选择python版本

mkvirtualenv -p python3 venvname

mkvirtualenv -p python2.7 venvname

【讨论】:

  • 非常适合在一台开发机器上轻松运行多个不同的环境。
  • 如何确定创建的虚拟环境安装了正确的python?如果我这样做which python 我会得到:/home/USER/.virtualenvs/venvname/bin/python
【解决方案2】:

我知道这在您的 cmets 中已基本解决,但仅限于 mac,

甚至更多我认为正确的方法应该是将VIRTUALENVWRAPPER_PYTHON设置为您在命令行上使用的真正的python。

为了确保你能做到which python

其实,你甚至可以这样做:

export VIRTUALENVWRAPPER_PYTHON=`which python`

在 linux 上,我在我的 .bashrc 中执行此操作,总而言之,假设您安装了 virtualenv 并创建了您的第一个“虚拟环境”virtualenv(多么原始)

. virtualenv/bin/activate
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want
export VIRTUALENVWRAPPER_PYTHON=`which python`
export PROJECT_HOME=SOMETHING
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed

(顺便说一句,你写道:

我检查了我的 .profile 并将 VIRTUALENVWRAPPER_PYTHON 设置为 /opt/local/bin/python,所以在我看来,无论我选择了哪个 python,virtualenvwrapper 都应该工作

这实际上是相反的——virtualenv 依赖于使用正确的 python(以及与之配套的软件包),因此相应地设置 python 路径非常重要。

一旦你被 virtualenved 了,即使运行带有“#!/bin/python”的 py 文件也可能会带来麻烦!

【讨论】:

  • 在我的 Mac 上运行一些测试 -- 它似乎 VIRTUALENVWRAPPER_PYTHON 仅控制 virtualenvwrapper 本身使用的 Python 可执行文件,而不是安装到虚拟环境中的可执行文件,例如当你运行mkproject。我很想错,但到目前为止,选择不同 Python 版本的唯一方法似乎是在virtualenvwrapper 命令行中使用-p / --python。如果这是真的,那就太可惜了。
  • @ChrisJohnson mmmh 从那以后我停止使用 virtualenvwrapper - 不再需要它 - 我没有简单的方法快速仔细检查,但你可能确实是对的......我也在 MAC 上使用现在冲泡...
  • 与 ubuntu 上的 @ChrisJohnson 相同。将我的 VIRTUALENVWRAPPER_PYTHON 设置为 python2,但 mkvirtualenv 正在使用 python3 创建虚拟环境。
【解决方案3】:

这些都不起作用。我在设置我的 osx 机器时首先安装了 Python3,然后 pip 和所有默认设置。

首先,检查你安装了哪个python:

$ `which python` -V

如果返回“Python 2.7.12”,那么你就可以运行了:

$ mkvirtualenv -p `which python` api_server
Running virtualenv with interpreter /usr/local/bin/python
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details

这也将激活api_server workon,它会更改您的 python 可执行文件:

$ which python
/Users/eric/.virtualenvs/api_server/bin/python
$ python -V
Python 2.7.12

which python 实际上是做什么的?它输出在您的 PATH 中找到的 python 可执行文件的目录:

$ which python
/usr/local/bin/python

通过使用which python,您基本上是将/usr/local/bin/python 传递给mkvirtualenv 目录中的-p 选项。

当您在which python 中返回多个 python 可执行文件时会发生什么?只需找到您想要的并将其传递进去:

$ mkvirtualenv -p /usr/local/bin/python3 api_server

而 virtualenvwrapper 最终将使用该 python 可执行文件。

【讨论】:

    【解决方案4】:

    确认使用了两个名称相似的环境变量:

    VIRTUALENVWRAPPER_PYTHON -- virtualenvwrapper 实用程序本身使用哪个 Python 版本。换句话说,哪个版本的 Python 执行 virtualenvwrapper,就好像那个 Python 版本已在 virtualenvwrapper 脚本文件的 #! 行中明确命名。

    VIRTUALENV_PYTHON -- 创建新虚拟环境时,virtualenv 将安装哪个 Python 版本。等效于virtualenv 命令行上的-p / --python 选项。

    也许很明显 :) 在虚拟环境中运行的 Python 版本是您为该环境安装的版本——在创建 env 后与上述环境变量无关。

    请参阅https://stackoverflow.com/a/24724360/763269,了解如何在 virtualenv 中升级 Python。

    【讨论】:

      【解决方案5】:

      您(OP)似乎已经用 python2.7 安装了 virtualenv 和 virtualenvwrapper,而不是用 python2.6。如果在你的 shell 加载 virtualenvwrapper.sh 脚本的时候调用了 python2.6,那就不高兴了。很简单。

      VIRTUALENVWRAPPER_PYTHON 是为这些情况而设计的。有了它,您可以确保始终使用正确版本的 python,而不必总是添加 -p /path/to/python2.7

      因此,在这种情况下,我不同意 Stefano 的回答,在 OP 的情况下,您应该在 .bashrc 中清楚地解释要使用哪个 python:

      ...
      export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7
      source /path/to/bin/virtualenvwrapper.sh
      

      这样应该一直没问题! Virtualenvwrapper 是为了简化事情。

      另外,请注意/opt/local/bin/python 必须是您使用port python select 选择的python 版本的符号链接(请使用ls -l /opt/local/bin/python 确认)。

      【讨论】:

      • 我想强调的是,如果您有分层终端阻止您设置环境变量(就像我一样),使用 -p 标志是一种解决方案。 mkvirtualenv -p /usr/bin/python3 Foo
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2015-06-16
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多