我正在尝试启动和运行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
我对命令行和虚拟环境都很陌生,所以我可能不知道一些“明显”的事情我做错了。感谢。
答案 0 :(得分:2)
命令行shell的一些基础知识:
PATH是一个环境变量,包含文件系统目录列表。当您键入ls
,python
或virtualenvwrapper.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.4
和virtualenv-2.7
为每个不同的Python创建虚拟环境。
所有这一切的关键是记住PATH用于解析运行程序的绝对路径位置。使用echo $PATH
和which
命令来帮助您了解最终路径的解析方式。
这可能看起来很单调乏味,但输入完整的绝对路径总是会对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的其他系统管理员,您将无法意外地发现您的应用程序崩溃。