我使用 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 都应该工作。
知道当我切换 python 版本时,什么会导致 virtualenvwrapper 生成 .hook_loader 错误吗?
您可以明确选择python版本
mkvirtualenv -p python3 venvname
或
mkvirtualenv -p python2.7 venvname
我知道这个问题在你的评论中已经基本解决了,但它仅限于 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 路径非常重要。
一旦使用虚拟环境,即使运行带有“#!/bin/python”的 py 文件也可能会带来麻烦!
这些都不起作用。我在设置 osx 机器时首先安装了 Python3,并且 pip 和 all 默认安装的。
首先,检查你安装了哪个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
工作,这会更改您的 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 可执行文件。
确认使用了两个名称相似的环境变量:
VIRTUALENVWRAPPER_PYTHON
——virtualenvwrapper 实用程序本身使用哪个 Python 版本。换句话说,哪个版本的 Python 执行 virtualenvwrapper
,就好像该 Python 版本已在 virtualenvwrapper 脚本文件的 #!
行中显式命名。
VIRTUALENV_PYTHON
——当您创建新的虚拟环境时,virtualenv
将安装哪个Python版本。相当于 -p / --python
命令行上的 virtualenv
选项。
也许很明显:)在虚拟环境中运行的Python版本是您为该环境安装的版本——创建env后与上述环境变量没有关系。
请参阅 https://stackoverflow.com/a/24724360/763269 了解如何在 virtualenv 中升级 Python。
要将多个版本的 python 与 virtualwrapper 一起使用,您需要重新安装该新版本的 virtualwrapper 及其相应的 pip 管理器。
假设您刚刚安装了 Python-3.12.0,那么您需要在终端中安装
sudo pip3.12 install virtualenv virtualenvwrapper
然后您可以继续使用不同的 python 版本创建环境
mkvirtualenv sexyspace -p python3.12
workon sexyspace
python
请注意,只要我输入 python,它就会加载正确的 python 版本。您也可以在环境中正常地
pip install
,因为它知道它必须在内部使用pip3.12
您(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
检查以确保)。