使用pyenv安装anaconda时,无法配置虚拟环境

26

我使用pyenv来管理python的安装和虚拟环境,我希望anaconda也可以作为其中一个安装选项,并且可以使用anaconda python创建虚拟环境。使用pyenv install anaconda3-2019.03成功地安装了anaconda python,我可以使用pyenv global anaconda3-2019.03激活该版本:

SamLee-PC:~ max$ pyenv versions
  system
  2.7.10
  2.7.10/envs/flask_tutorial
* 3.7.4 (set by /Users/max/.pyenv/version)
  3.7.4/envs/learning_python
  3.7.4/envs/microblog
  3.7.4/envs/stocktool
  3.7.4/envs/test1
  anaconda3-2019.03
  anaconda3-2019.03/envs/datsci
  datsci
  flask_tutorial
  learning_python
  microblog
  stocktool
  test1
SamLee-PC:~ max$ pyenv which python
/Users/max/.pyenv/versions/3.7.4/bin/python
SamLee-PC:~ max$ pyenv global anaconda3-2019.03
(anaconda3-2019.03) SamLee-PC:~ max$ pyenv which python
/Users/max/.pyenv/versions/anaconda3-2019.03/bin/python
(anaconda3-2019.03) SamLee-PC:~ max$ pyenv which conda
/Users/max/.pyenv/versions/anaconda3-2019.03/bin/conda

我不知道为什么只有安装anaconda后才会在命令提示符中添加python版本。

当我创建一个新的虚拟环境 (pyenv virtualenv anaconda3-2019.03 datsci) 时,它似乎按预期工作:

SamLee-PC:~ max$ pyenv which python
/Users/max/.pyenv/versions/3.7.4/bin/python
SamLee-PC:~ max$ cd code/linkedin/datsci
(datsci) SamLee-PC:datsci max$ pyenv which python
/Users/max/.pyenv/versions/datsci/bin/python
(datsci) SamLee-PC:datsci max$ 
这个相对位置与我的其他虚拟环境中通过 "pyenv which python" 返回的相对位置相同,这些环境都正常工作。问题在于,在虚拟环境中运行的 Python 版本无法访问 Anaconda 的所有包。
(datsci) SamLee-PC:datsci max$ anaconda-navigator
pyenv: anaconda-navigator: command not found

The `anaconda-navigator' command exists in these Python versions:
  anaconda3-2019.03

(datsci) SamLee-PC:datsci max$ 

虽然如果我手动激活Python安装程序,它就会起作用:

SamLee-PC:~ max$ pyenv global anaconda3-2019.03
(anaconda3-2019.03) SamLee-PC:~ max$ anaconda-navigator
WARNING: The conda.compat module is deprecated and will be removed in a future release.
/Users/max/.pyenv/versions/anaconda3-2019.03/lib/python3.7/site-packages/anaconda_navigator/api/conda_api.py:1364: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(f)
2019-09-21 14:03:38,666 - ERROR download_api._download:234
Invalid url https://www.anaconda.com/wp-content/uploads/2017/05/Webinar20-20Three20Ways20to20Move20your20Data20Science20Projects20to20Production.png
#anaconda navigator GUI opens
< p >(奇怪的是,datsci指向的Python版本似乎确实认识conda:< / p >
(datsci) SamLee-PC:datsci max$ pyenv which python
/Users/max/.pyenv/versions/datsci/bin/python
(datsci) SamLee-PC:datsci max$ conda
usage: conda [-h] [-V] command ...

conda is a tool for managing and deploying applications, environments and packages.

...

问题是,据我所知,每当我想要使用anaconda时以这种方式激活python版本,这意味着我只能访问一个版本的anaconda python - 这违背了在虚拟环境中使用它的目的。

还有一个谜题 - 我注意到对于我的其他虚拟环境,~/.pyenv/versions/name-of-virtualenv包含一个文件pyvenv.cfg,其中包含如下内容:

  1 home = /Users/max/.pyenv/versions/3.7.4/bin                                                                   
  2 include-system-site-packages = false
  3 version = 3.7.4

~/.pyenv/versions/datsci中没有这样的文件,因此我添加了一个:

  1 home = /Users/max/.pyenv/versions/anaconda3-2019.03/bin                                                       
  2 include-system-site-packages = false
  3 version = anaconda3-2019.03

毫无作用。

顺便提一句,该目录的内容如下:

(anaconda3-2019.03) SamLee-PC:datsci max$ pwd
/Users/max/.pyenv/versions/datsci
(anaconda3-2019.03) SamLee-PC:datsci max$ ls
bin     conda-meta  include     lib     pyvenv.cfg  share       ssl
(anaconda3-2019.03) SamLee-PC:datsci max$ 

我在想我是否在 pyvenv.cfg 文件中放错了内容,导致无法进行数据科学方面的工作......但我很茫然。

我非常喜欢 pyenv 的工作方式,并且想继续使用它。有没有一种方法可以配置 anaconda 以使其在 pyenv 下正常工作?

更新:

根据 Simba 的建议,我卸载了由 pyenv 管理的 anaconda 并进行了全新安装。现在默认情况下,pyenv 确定活动 python 安装,我可以使用 conda activate base 来激活 conda:

Maxs-MacBook-Air:~ max$ which python
/Users/max/.pyenv/shims/python
Maxs-MacBook-Air:~ max$ conda activate base
(base) Maxs-MacBook-Air:~ max$ which python
/Users/max/anaconda3/bin/python
(base) Maxs-MacBook-Air:~ max$ 

然而,使用 conda create --name datsci 命令创建一个新的 conda 环境后,新的 conda 环境似乎无法正常激活:

Maxs-MacBook-Air:~ max$ conda activate datsci
(datsci) Maxs-MacBook-Air:~ max$ which python
/Users/max/.pyenv/shims/python

我漏掉了什么?

这是我的.bash_profile文件的内容:

  1 export PATH="/Users/max/.pyenv/bin:$PATH"                                                                                                                                                                                                 
  2 eval "$(pyenv init -)"
  3 eval "$(pyenv virtualenv-init -)"
  4 
  5 # >>> conda initialize >>>
  6 # !! Contents within this block are managed by 'conda init' !!
  7 __conda_setup="$('/Users/max/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
  8 if [ $? -eq 0 ]; then
  9     eval "$__conda_setup"
 10 else
 11     if [ -f "/Users/max/anaconda3/etc/profile.d/conda.sh" ]; then
 12         . "/Users/max/anaconda3/etc/profile.d/conda.sh"
 13     else
 14         export PATH="/Users/max/anaconda3/bin:$PATH"
 15     fi
 16 fi
 17 unset __conda_setup
 18 # <<< conda initialize <<<

我需要在Simba的.bash_profile中复制if语句吗?

更新2:

问题已解决,我需要在新环境中安装python。

1个回答

89

个人建议:不要使用pyenv来安装Anaconda或Miniconda。

既可以使用pyenv也可以使用conda来管理不同的Python环境。但是,由pyenv安装的anaconda应该只作为一个Python解释器使用。从由pyenv安装的anaconda创建Python环境仍然需要使用pyenv virtualenv命令,而非conda env create命令。

我曾经尝试过将这两个工具一起使用,结果发现最好的解决方案是分别安装condapyenv,并将它们的虚拟环境分开管理。

  1. 始终初始化pyenv
  2. 仅暴露conda命令,但不激活任何环境

详情

安装pyenv

正常安装Anaconda或Miniconda,不要使用pyenv install命令安装。

确保在交互式shell中可以使用pyenvconda命令。

通过将下面的内容放入shell初始化文件(对于Bash使用.bashrc,对于ZSH使用.zshrc)来初始化pyenv

# Put the content into ~/.bashrc or ~/.bash_profile for Bash,
# .zshrc for ZSH

# you may need to add dir of command `pyenv` into PATH,
# if command pyenv is not available yet

if command -v pyenv &>/dev/null; then
    eval "$(pyenv init -)"
fi
if command -v pyenv-virtualenv &>/dev/null; then
    eval "$(pyenv virtualenv-init -)"
fi

暴露命令conda但不激活任何环境,甚至不激活base环境。在您的shell中执行以下命令。

# Run the content in the shell

# init conda, the following command write scripts into your shell init file automatically
conda init

# disable init of env "base"
conda config --set auto_activate_base false

注意:完成此设置后,默认的 Python 版本是由 pyenv global 设置的。使用 pyenvconda 分别管理环境。
虚拟环境管理示例:
# virtual environments from pyenv
pyenv install 3.6.9
pyenv virtualenv 3.6.9 new-env
pyenv activate new-env
pyenv deactive
# You can also use `pyenv local`


# virtual environments from conda
conda env create new-env python=3.6
conda env list
conda activate new-env
conda deactivate
< p > pyenv 的默认环境位置是 ~/.pyenv/versions

conda 的默认环境位置,请查看 conda info 命令的输出。

参考资料


5
谢谢!对我有帮助。conda config --set auto_activate_base false,这个方法对我起了作用。 - dkapitan
第二个 if 应该查找命令 pyenv virtualenv(没有连字符) - Saverio Guzzo
1
@SaverioGuzzo 你误解了。pyenv virtualenv 不是一个命令,它是 pyenv 命令调用其子命令 virtualenvpyenv virtualenv foo 调用 pyenv 并将 virtualenv foo 作为参数传递给它。pyenv 接受这些参数,将调用分派到命令/脚本 pyenv-virtualenv,并将 foo 作为参数传递。基本上,最后会调用 pyenv-virtualenv foo。这就是 pyenv 的工作原理。 - Simba
2
pyenv-virtualenv在其GitHub页面(https://github.com/pyenv/pyenv-virtualenv)上宣传可以管理conda环境。为什么您更喜欢将它们分开? - Wouter van Amsterdam
非常感谢您提供的详细解释和配方,我一直在使用pyenv管理miniconda,真是一场噩梦。 - undefined
显示剩余2条评论

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