Anaconda 不使用来自激活环境的包

tso*_*orn 3 python python-3.x anaconda conda

conda在 bash 终端中有一个环境,带有 Intel Python Distribution 解释器。但是,在导入包时,它们是从系统默认 Python 的用户目录中导入的,而不是从环境中导入的。查看版本差异和包的__spec__来源pandas

 ~ ? $ ? conda activate idp
 ~ ? $ ? which python
~/anaconda3/envs/idp/bin/python
 ~ ? $ ? python
Python 3.6.8 |Intel Corporation| (default, Mar  1 2019, 00:10:45) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Intel(R) Distribution for Python is brought to you by Intel Corporation.
Please check out: https://software.intel.com/en-us/python-distribution
>>> import pandas
>>> pandas.__version__
'0.22.0'
>>> pandas.__spec__
ModuleSpec(name='pandas', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f509e184ba8>, origin='/home/torstein/.local/lib/python3.6/site-packages/pandas/__init__.py', submodule_search_locations=['/home/torstein/.local/lib/python3.6/site-packages/pandas'])
>>> 
 ~ ? $ ? conda list | head -n 3
# packages in environment at /home/torstein/anaconda3/envs/idp:
#
# Name                    Version                   Build  Channel
 ~ ? $ ? conda list | grep pandas
pandas                    0.24.1                   py36_3    intel
 ~ ? $ ? conda env list
# conda environments:
#
base                     /home/torstein/anaconda3
idp                   *  /home/torstein/anaconda3/envs/idp
py36                     /home/torstein/anaconda3/envs/py36
Run Code Online (Sandbox Code Playgroud)

使用base环境时,不会发生这种情况;包(例如pandas)从正确的路径导入:

 ~ ? $ ? conda deactivate
 ~ ? $ ? conda env list
# conda environments:
#
base                  *  /home/torstein/anaconda3
idp                      /home/torstein/anaconda3/envs/idp
py36                     /home/torstein/anaconda3/envs/py36

 ~ ? $ ? which python
~/anaconda3/bin/python
 ~ ? $ ? python
Python 3.7.0 (default, Oct  9 2018, 10:31:47) 
[GCC 7.3.0] :: Anaconda custom (64-bit) on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
pan>>> pandas.__version__
'0.23.4'
>>> pandas.__spec__
ModuleSpec(name='pandas', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fad808a8e80>, origin='/home/torstein/anaconda3/lib/python3.7/site-packages/pandas/__init__.py', submodule_search_locations=['/home/torstein/anaconda3/lib/python3.7/site-packages/pandas'])
Run Code Online (Sandbox Code Playgroud)

的相关部分.bashrc(在路径中没有明确设置 anaconda):

export PATH="/home/torstein/.cargo/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/intel/lib/intel64_lin:/opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/lib/intel64_lin/"

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/torstein/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/torstein/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/torstein/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/torstein/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
Run Code Online (Sandbox Code Playgroud)

分别$PATH为 thebaseidpenvs产生这些s :

 ~ ? $ ? echo $PATH
/home/torstein/anaconda3/bin:/home/torstein/anaconda3/condabin:/home/torstein/.cargo/bin:/home/torstein/.cargo/bin:/home/torstein/anaconda3/bin:/home/torstein/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/torstein/.local/bin:/home/torstein/bin
 ~ ? $ ? conda activate idp
 ~ ? $ ? echo $PATH
/home/torstein/anaconda3/envs/idp/bin:/home/torstein/anaconda3/condabin:/home/torstein/.cargo/bin:/home/torstein/.cargo/bin:/home/torstein/anaconda3/bin:/home/torstein/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/torstein/.local/bin:/home/torstein/bin
Run Code Online (Sandbox Code Playgroud)

pandas希望进口在这里,所在的位置应该是:

/home/torstein/anaconda3/envs/idp/lib/python3.6/site-packages/pandas

mer*_*erv 6

诊断

似乎有(或已经)在另一个Python 3.6 PATH,我怀疑,不知怎的,在康达依赖解析器最终解决一些程序包这种替代site-packages在不经意间,包括在此目录中sys.path。这似乎是一个已知问题

证据

我相信这是因为pandas模块是从这里加载的:

/home/torstein/.local/lib/python3.6/site-packages/pandas

如果你签入 Python

import sys

sys.path
Run Code Online (Sandbox Code Playgroud)

我希望这应该显示上述目录。

由于据报道它PYTHONPATH是空的(应该是!),因此不能对这种错误加载负责,因此我认为是 Conda 以某种方式以某种方式配置了 env。

此外,您的 Python 3.7 env 不受影响的事实可能是因为您无法跨不同的次要版本加载模块。

即时解决方案

你需要以某种方式摆脱这种依赖。有几件事可以尝试

  1. 删除/home/torstein/.local/PATH。但这可能会导致其他问题。大概你有它,PATH因为你有其他非开发的东西。
  2. 专门转储该site-packages目录。在评论中,有人指出这是不再使用的全局 Python 安装的残余,因此摆脱它似乎是一件好事。但是,请备份它,以防它有其他依赖项。
  3. sys.path在导入模块之前清除此路径。不确定一个干净的方法来做到这一点。

就个人而言,我想删除它并创建新的环境。很难知道您与该目录的关联程度如何,因此我会谨慎地假设其他软件包不会以某种方式对其中的内容具有隐藏的依赖关系。

长期解决方法

来自GitHub 问题的推荐解决方法是添加以下环境变量,

export PYTHONNOUSERSITE=True
Run Code Online (Sandbox Code Playgroud)

这可以防止 Conda 加载其他本地site-packages目录。有了这个,你一开始就不应该遇到这个问题。