如何配置virtualenvwrapper以使用pyenv

时间:2014-01-25 11:05:11

标签: python-2.7 virtualenvwrapper

我正在尝试设置我的imac(mavericks)以便能够轻松切换到不同版本的python。我成功地用rbenv为Ruby项目做了这个,发现pyenv正是我在这方面所寻求的。我遇到的问题是用pyenv创建虚拟环境。

我尝试安装pyenv-virtualenv,因为我认为这对pyenv很有效,但它现在看起来很破碎,我很难得到详细的回复。首先'activate'命令不起作用(它说命令不存在,尽管有文档),一旦我安装了pyenv-virtualenv插件,pyenv就不再使用正确的python版本了。最终我删除了插件,pyenv再次开始工作。

现在我想将常规virtalenvwrapper与pyenv一起使用,但仍然遇到错误,我没有足够的经验来解决。

首先,我根据文档安装了pyenv和virtualenv以及virtualenvwrapper。然后我用pyenv安装了python 2.7.6。这似乎工作正常,但当我尝试在.bash_profile中配置virtualenvwrapper设置时 - 我遇到以下错误:

-bash: /usr/local/bin/python: No such file or directory
virtualenvwrapper.sh: There was a problem running the initialization hooks. 

If Python could not import the module virtualenvwrapper.hook_loader,  
check that virtualenv has been installed for
VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python and that PATH is
set properly.

如果我检查python路径,我会得到这个:

bin [master] >> which python
/usr/bin/python
bin [master] >> pyenv which python
/Users/insomniac/.pyenv/versions/2.7.6/bin/python

我尝试将VIRTUALENVWRAPPER_PYTHON设置为/usr/local/bin/python/usr/bin/python 但这些设置似乎都不起作用 - 我继续得到同样的错误。

我真的不想使用/Users/insomniac/.pyenv/versions/2.7.6/bin/python 因为这似乎是错误的,因为python版本被指定并且反对能够切换python版本。

这些是我的.bash_profile中的相关设置:

# Set  PYTHONPATH
export PYTHONPATH=/Users/insomniac/Repo/tools/python/:$PYTHONPATH

# User paths first
export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:sbin:$PATH

# virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Repo
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv

# Load virtualenvwrapper after paths are set
if [[ -s /usr/local/bin/virtualenvwrapper.sh ]]; then
source /usr/local/bin/virtualenvwrapper.sh
fi

# PYENV
# To use Homebrew directories rather than ~/.pyenv
#export PYENV_ROOT=/usr/local/opt/pyenv  
eval "$(pyenv init -)"

# Load .bashrc if it exits (python definitions)
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

.bashrc文件具有以下设置:

# allow install and upgrade of global package with pip
syspip(){
PIP_REQUIRE_VIRTUALENV="" pip "$@"
}

# run this for global install or upgrade
# syspip install --upgrade pip setuptools virtualenv

# PIP
# pip should only run if there is a virtualenv currently activated
# this it to prevent accidentally installing a package globally
# use syspip() to install globally
export PIP_REQUIRE_VIRTUALENV=true

# cache pip-installed packages to avoid re-downloading
export PIP_DOWNLOAD_CACHE=$HOME/.pip/cache

我很尴尬地承认我花了大约一个星期的时间试图从大量不同的帖子和教程中拼凑起来。我已经阅读了pyenv,virtualenv和virtualenvwrapper的文档,我仍然不清楚如何使它与pyenv一起使用。

我希望我已经足够好地解释了这一点并且遵循了所有发布规则。如果有更好的解决方案(这更容易),那么我全都听见了。任何帮助将不胜感激。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您获得的错误意味着您的文件系统中根本没有文件/usr/local/bin/python。它与您正在调整的设置关系不大,但与您正在运行的脚本的期望有关。

您可以查看virtualenvwrapper.sh的内容,看看它是否包含对/usr/local/bin/python的明确引用?乍一看,您的.bash_profileVIRTUALENVWRAPPER_PYTHON指向该文件,并且由于该文件不存在 - 您有错误消息。

我不确定virtualenv包装器应该如何工作。但是要修复错误,你需要了解你希望脚本使用哪个python实例,并指出它们,或者创建指向正确python实例的符号链接/usr/local/bin/python(使用link -s命令终端)。

另一方面,似乎pyenv可能没有正确安装(或完全安装) - 因为他们documentation表示它可以通过在~/.pyenv/shims前面插入PATH来实现你在这里没有的变量。您可以在.bash_profile中手动添加该内容,看看是否有帮助(在更新source ~/.bash_profile后重新加载配置文件)。

更新:我尝试使用自制软件安装pyenv,最后看到有关设置它的消息:

To enable shims and autocompletion add to your profile:
  if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

To use Homebrew's directories rather than ~/.pyenv add to your profile:
  export PYENV_ROOT=/usr/local/opt/pyenv

.bash_profile中有哪种(有种)。 echo $PATH显示什么?

答案 1 :(得分:2)

我明白了。我在〜/ .bash_profile

中有下面的脚本

唯一的问题是在用pyenv安装python之后,你需要安装
(pip install virtualenvwrapper)在新的python环境中,在设置新的虚拟环境之前。

然后你很高兴。

export PYENV_ROOT="${HOME}/.pyenv"

if [ -d "${PYENV_ROOT}" ]; then
    export PATH="${PYENV_ROOT}/bin:${PATH}"
    eval "$(pyenv init -)"
fi
export PATH

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh
source /usr/local/bin/virtualenvwrapper_lazy.sh

答案 2 :(得分:0)

我根本没有通过 apt 或 pip 安装 virtualenvwrapper。 我已经安装了 pyenv 和它的 virtualenvwrapper 插件:

  <section class="allquiz">
<div class="sectionarea">
    <form action= '' method = "POST" >
        {% for question in questions %}       
    <div class = 'question'>Q{{ question.question_name }} </div><br>
    <div id= "choices" class='select'>
        <input type = "radio" name="{{forloop.counter}}" value="A{{question.pk}}" required>{{question.option_a}}<br>
        <input type = "radio" name="{{forloop.counter}}" value="B{{question.pk}}" required>{{question.option_b}}<br>
        <input type = "radio" name="{{forloop.counter}}" value="C{{question.pk}}" required>{{question.option_c}}<br>
        <input type = "radio" name="{{forloop.counter}}" value="D{{question.pk}}" required>{{question.option_d}}<br>
        
    </div>
    <br> 
        {% endfor %}
    <div style="text-align:center"> <input style="padding: 10px 35px;font-size:120%;cursor: pointer;" type="submit" class="submit" id="submit" value="Submit"/></div>
        {% csrf_token %}
    </form>
</div>

在 .bashrc 中我有:

git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv
git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git ~/.pyenv/plugins/pyenv-virtualenvwrapper

当我安装一些 python 并将其设为全局时:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
pyenv virtualenvwrapper

然后使用现代版本的 pyenv 和插件, 当我使用任何命令时

pyenv update  # to have access to latest python versions
pyenv install 3.9.1
pyenv global 3.9.1

当前全局 python 版本缺少的 virtualenvwrapper 将自动安装并且一切正常。 IE。如果您更改全局 python 版本,virtualenvwrapper 会为新版本再次安装。