Mac上的虚拟环境使用python 3.4

时间:2015-10-06 15:34:37

标签: python macos bash virtualenv virtualenvwrapper

我正在尝试启动和运行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

我对命令行和虚拟环境都很陌生,所以我可能不知道一些“明显”的事情我做错了。感谢。

1 个答案:

答案 0 :(得分:2)

命令行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解析为两个不同的蟒蛇,那根本不可能。它将始终根据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环境后更加可靠。

最后,甚至专业人士也可以通过玩游戏操纵路径来绊倒。您最终会尝试将一堆不同的应用程序位置整合到一个命名空间中。在某些时候,冲突可能变得无法解决。像Buildout这样的Python安装工具有它自己的学习曲线,但它硬编码了它安装的每个python脚本的python的绝对路径。硬编码绝对路径是处理极端极端情况的唯一方法,例如并行构建两个Python 3.4,其中有两个脚本,每个脚本需要在同一个Python的两个不同构建上运行。在生产环境中也需要硬编码绝对位置,因为那时您的应用程序不受bash shell的任何更改的影响。如果您忘记了PATH的必需订购,或者忘记了使用PATH的其他系统管理员,您将无法意外地发现您的应用程序崩溃。