Python 2.7 如何配置VirtualEnvRapper以与pyenv一起工作

Python 2.7 如何配置VirtualEnvRapper以与pyenv一起工作,python-2.7,virtualenvwrapper,Python 2.7,Virtualenvwrapper,我正在尝试设置我的imac(mavericks),以便能够轻松地切换到不同版本的python。我用rbenv为Ruby项目成功地完成了这项工作,并发现pyenv正是我在这方面所寻找的。我遇到的问题是使用pyenv创建虚拟环境 我曾尝试安装pyenv virtualenv,因为我认为它可以很好地与pyenv配合使用,但目前它似乎已损坏,我很难获得详细的响应。首先,“activate”命令不起作用(它说该命令不存在,尽管有文档),一旦我安装了pyenv virtualenv插件,pyenv就不再使用

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

我曾尝试安装pyenv virtualenv,因为我认为它可以很好地与pyenv配合使用,但目前它似乎已损坏,我很难获得详细的响应。首先,“activate”命令不起作用(它说该命令不存在,尽管有文档),一旦我安装了pyenv virtualenv插件,pyenv就不再使用正确的python版本。最终我删除了插件,pyenv又开始工作了

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

首先,我根据文档安装了pyenv、virtualenv和virtualenvwrapper。然后,我用pyenv安装了python2.7.6。这似乎很好,但当我尝试在.bash_profile中配置VirtualEnvrapper设置时,我遇到了以下错误:

-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
我尝试将
virtualnewrapper\u PYTHON
设置为
/usr/local/bin/PYTHON
/usr/bin/PYTHON
但这两种设置似乎都不起作用——我继续得到同样的错误

我真的不想使用
/Users/insomniac/.pyenv/versions/2.7.6/bin/python
因为这似乎是错误的,因为正在指定python版本,并且不利于切换python版本

以下是my.bash_配置文件中的相关设置:

# 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一起工作

我希望我已经解释得足够清楚,并且遵守了所有的发帖规则。如果有更好的解决方案(更容易),我会洗耳恭听。任何帮助都将不胜感激


提前谢谢

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

您能检查一下
virtualenvwrapper.sh
的内容,看看它是否包含对
/usr/local/bin/python
的明确引用吗?乍一看,您的
.bash\u配置文件
中有
VIRTUALENVWRAPPER\u PYTHON
指向该文件,由于该文件不存在,因此您会收到一条错误消息

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

另一方面,pyenv似乎没有正确(或完全)安装——正如他们所说,它通过在
路径
变量前面插入
~/.pyenv/垫片
工作,而您在这里没有该变量。您可以手动将其添加到
.bash\u profile
中,并查看是否有帮助(在更新
source~/.bash\u 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\u配置文件中有(某种程度上)这些文件。echo$PATH显示了什么?

我弄明白了。我的~/.bash_档案中有下面的脚本

唯一的问题是,在使用pyenv安装python之后,需要安装
(pip安装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

我还没有通过apt或pip安装VirtualVWrapper。 我已经安装了pyenv及其VirtualEnvRapper插件:

git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv
git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git ~/.pyenv/plugins/pyenv-virtualenvwrapper
在.bashrc中,我有:

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
当我安装一些python并使其全局化时:

pyenv update  # to have access to latest python versions
pyenv install 3.9.1
pyenv global 3.9.1
然后使用现代版本的pyenv和插件, 当我使用任何命令时

workon
mkvirtualenv

当前全局python版本缺少的VirtualEnvrapper将自动安装,一切正常。例如,如果更改全局python版本,VirtualEnvRapper将再次安装新版本。

此解决方案适用于我使用pyenv 1.2.22和python 3.6.8的情况。只是一个问题,$HOME/Devel的位置没有什么特别的,对吗?我可以在任何地方定义PROJECT_HOME,对吗?