47

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

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

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

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

4

5 回答 5

53

您可以明确选择 python 版本

mkvirtualenv -p python3 venvname

或者

mkvirtualenv -p python2.7 venvname
于 2019-05-03T14:49:08.903 回答
37

我知道这在你的评论中已经解决了,但它只是 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 文件也可能会带来麻烦!

于 2012-05-10T13:09:47.103 回答
19

这些都不起作用。在设置我的 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_serverworkon,它会更改您的 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,您基本上是传入mkvirtualenv 目录/usr/local/bin/python中的-p选项。

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

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

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

于 2016-11-10T21:25:42.763 回答
11

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

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

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

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

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

于 2016-08-08T15:07:27.667 回答
-1

您(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必须是您选择的 python 版本的符号链接port python select(请检查ls -l /opt/local/bin/python以确保)。

于 2012-10-11T10:42:49.367 回答