如何配置 virtualenvwrapper 与 pyenv 协同工作

6
我正在尝试设置我的iMac(Mavericks)以便能够轻松地切换到不同版本的Python。我已经成功地为Ruby项目使用rbenv完成了此操作,并发现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配合使用。
我希望我已经足够清楚地解释了这个问题,并且遵循了所有的发布规则。如果有更好的解决方案(更容易),我会耳听八方。非常感谢您的任何帮助。
提前致谢。
4个回答

3

我已经搞清楚了。我在我的~/.bash_profile文件中有以下脚本。

唯一的问题是,在使用pyenv安装python后,您需要在新的python环境中安装(pip install virtualenvwrapper),然后才能设置新的虚拟环境。

然后您就可以开始使用了。

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

这个解决方案对我来说在pyenv 1.2.22和Python 3.6.8上有效。只是一个问题,$HOME/Devel位置没有什么特别的,我可以定义PROJECT_HOME在任何我想要的地方,对吗? - Mauricio Reis

2
“您所遇到的错误意味着您的文件系统中根本没有文件 '/usr/local/bin/python'。这与您正在调整的设置关系较小,而与您正在运行的脚本的期望有关。
请检查 'virtualenvwrapper.sh' 的内容,并查看它是否包含对 '/usr/local/bin/python' 的显式引用。乍一看,您的 '.bash_profile' 指向该文件的 'VIRTUALENVWRAPPER_PYTHON',因为该文件不存在,所以会出现错误消息。
我不确定 virtualenv wrapper 应该如何工作。但是要修复错误,您需要了解要将脚本指向哪个 Python 实例,然后将其指向该实例,或者创建一个符号链接 '/usr/local/bin/python',指向正确的 Python 实例(使用终端中的 'link -s' 命令)。”
另一方面,似乎 pyenv 可能未被正确安装(或完全安装)- 因为他们的 文档 表示它通过将 ~/.pyenv/shims 插入到您的 PATH 变量前来工作,而这里没有。您可以手动在 .bash_profile 中添加该内容,看看是否有帮助(更新后重新加载配置文件 source ~/.bash_profile)。

更新:我尝试使用 homebrew 安装 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 会显示什么?

0

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

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 版本所缺少的 virtualenvwrapper 自动安装,一切都能正常工作。即,如果更改全局 Python 版本,则 virtualenvwrapper 会为新版本重新安装。


3
pyenv update
pyenv:没有名为 `update' 的命令
- duff18

0
作为长期使用virtualenvwrapper的用户,我在尝试让pyenv-virtualenvwrapper正常工作时遇到了困难,直到我意识到你必须删除在安装virtualenvwrapper时被告知在你的.bashrc(或者在我的情况下是.zshrc)中设置的内容(除了可能是$WORKON_HOME)。
相反地,在启动你的shell或会话时,你需要运行
pyenv virtualenvwrapper

为了设置以前通过在启动文件中引用virtualenvwrapper.sh来设置的shell函数。所以我猜你需要每次登录时都这样做。请注意,你需要

 pip install virtualenvwrapper 

在你想要用于虚拟环境的pyenv shell中,正如这里的另一个评论所述。
然后,当你运行通常的mkvirtualenv命令时,它将在通常的virtualenvwrapper目录~/.virtualenvs中创建一个指向当前pyenv Python shell的虚拟shell。
对于大多数人来说,这可能是显而易见的,但也许其他人遇到了和我一样的问题,我很抱歉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接