Mac 上的虚拟环境,python 3.4

Virtual Env on Mac with python 3.4

我正在尝试建立一个 django 项目 运行,我有 django 运行,但我在使用 python 的 virtualenv 时遇到了问题。

这是我的错误(在终端打开时显示)

/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named virtualenvwrapper
virtualenvwrapper.sh: There was a problem running the initialization hooks. 

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python and that PATH is
set properly.

这是我的 .bash 个人资料的样子:

# Setting PATH for Python 3.4
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}"
export PATH

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

export WORKON_HOME=$HOME/.virtualenvs
source     /Library/Frameworks/Python.framework/Versions/3.4/bin/virtualenvwrapper.sh
export PIP_VIRTUALENV_BASE=$WORKON_HOME
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

我对命令行和虚拟环境还很陌生,所以我可能不知道某些 "obvious" 我做错了什么。谢谢

首先是命令行的一些基础知识shell:

PATH 是一个包含文件系统目录列表的环境变量。当您键入 lspythonvirtualenvwrapper.sh 等命令时,您的 shell 将从列出的第一个目录开始搜索每个目录。要查看您当前的 PATH 类型:

$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

要查看给定命令将解析到将要 运行 的程序的位置,请使用 which 命令:

$ which ls
/bin/ls

现在在您的示例中,您首先将 Python 3.4 位置添加到您的 PATH,然后添加 Python 2.7 位置。后一个位置将首先出现在您的 PATH 中。因此,所有与 Python 相关的命令都将首先尝试 运行 Python 2.7,如果在那里找不到命令,它接下来会在 Python 3.4 安装中搜索。

您似乎已经为 Python 3.4 安装了 virtualenvwrapper,但是当您 运行 virtualenvwrapper.sh 从以下行安装时:

source     /Library/Frameworks/Python.framework/Versions/3.4/bin/virtualenvwrapper.sh

您明确地运行正在为 Python 3.4 安装 virtualenvwrapper.sh。此 运行 是一个 python 命令,其中您的 Python 2.7 是 运行,它似乎没有安装 virtualenvwrapper,如以下错误消息所示:

/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named virtualenvwrapper

如果您尝试删除 PATH 中的 Python 2.7 位置添加但没有成功,您必须记住,对 .bash_profile 的更改不会自动反映在您的终端中。您必须创建一个新的终端会话,该新会话将读取您的新 .bash_profile.

如果您试图让命令 virtualenv 解析为两个不同的 Python,那根本不可能。它将始终根据 PATH 上位置的顺序解析为一个特定的 Python。 VirtualEnv 会安装命令的替代版本,并在名称中内置 Python 的版本。使用命令 virtualenv-3.4virtualenv-2.7 为每个不同的 Python.

创建虚拟环境

所有这一切的关键是记住 PATH 用于解析程序的绝对路径位置,即 运行。使用 echo $PATHwhich 命令可帮助您了解如何解析最终路径。

这可能看起来很乏味,但输入完整的绝对路径总是会避开 PATH 解析的魔力:

$ /Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv

尝试使用较小的步骤来操纵路径。仅使用 virutalenv-3.4 创建一个 Python 3.4 虚拟环境,并且仅在您需要时引入 virtualenvwrapper,并且在您对 shell 环境的理解更加扎实之后。

最后,即使是专业人士也可能因为玩操纵路径的游戏而被绊倒。您最终会尝试获取一堆不同的应用程序位置并将它们全部扁平化到一个名称空间中。在某些时候,冲突可能变得无法解决。 Python 安装工具如 Buildout 有它自己的学习曲线,但它硬编码了它安装的每个 python 脚本的 python 的绝对路径。硬编码绝对路径是处理极端极端情况的唯一方法,例如并排构建两个 Python 3.4,其中您有两个脚本,每个脚本都需要在两个不同的构建上 运行相同 Python。硬编码绝对位置在生产环境中也是可取的,因为这样你的应用程序就不会受到 bash shell 的任何更改的影响。如果您忘记了 PATH 的必需顺序,或者其他系统管理员修改了 PATH,您将不会发现您的应用程序意外中断。