Anaconda不使用激活环境中的软件包

时间:2019-03-10 15:38:22

标签: python python-3.x anaconda conda

在bash终端中,我有一个conda环境,带有一个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

在使用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'])

.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

分别为$PATHbase的envs产生以下idp 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

我要导入的pandas 位于此处,该位置应为

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

2 个答案:

答案 0 :(得分:1)

诊断

PATH中似乎有(或曾经有)另一个Python 3.6,我怀疑Conda依赖解析器最终以某种方式将某些软件包解析为该替代site-packages,并且无意中包括了该目录在sys.path中。这似乎是a known issue

证据

我认为这是因为pandas模块是从此处加载的:

  

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

如果您签入Python

import sys

sys.path

我希望它应该显示上面的目录。

由于据报导PYTHONPATH为空(应该是!),所以这不是造成这种错误加载的原因,因此,我认为正是Conda以某种方式配置了环境。

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

立即解决方案

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

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

我个人希望将其删除并创建新的环境。很难知道您与该目录有多紧密联系,因此我会谨慎地假设其他软件包对其中的内容没有隐藏的依赖关系。

长期解决方法

the GitHub issue开始的推荐解决方法是添加以下环境变量

export PYTHONNOUSERSITE=True

,可防止Conda加载其他本地site-packages目录。有了这个,您首先就不会遇到问题。

答案 1 :(得分:-2)

解决方法是:在anaconda \ env \ xyz(以及其他实现中)中,将路径环境变量设置为安装“ python.exe”的目录。

默认情况下,anaconda中的python.exe文件位于:

c:\.....\anaconda\env\xyz

完成此操作后,很明显,在我的情况下,python命令有效,产生以下内容。

python
Python 3.4.3 |Anaconda 2.2.0. (64|bit)|(default, Nov 7 2015), etc, etc