【问题标题】:Anaconda does not use package from activated environmentAnaconda 不使用激活环境中的包
【发布时间】:2019-03-10 15:38:22
【问题描述】:

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

 ~  $  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

分别为 baseidp 环境生成这些 $PATHs:

 ~  $  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

【问题讨论】:

  • @merv:我应该排除哪些路径?我真的需要从头开始创建整个 conda 环境,还是您的意思是手动设置路径然后再次尝试导入? /home/torstein/.local/lib/python3.6/ 未明确包含在 $PATH 中。
  • 顺便说一下,在 py36 环境下使用 anaconda 的 pip 安装的软件包最终会出现在 /home/torstein/.local/lib/python3.6/site-packages/ 中吗?因为没有系统范围的python 3.6安装(但从前有)。
  • 我假设其他 Python 3.6 来自 /home/torstein/.local/bin,基于​​站点包。我会重新创建整个东西 - 大多数包都应该被缓存,所以它不应该花很长时间。但是,如果您愿意,也可以不试一试;不过,我希望依赖解析器已经在 idp 环境中设置了指向错误site-packages 的内容。
  • 没有系统范围的 python 3.6 安装 哦,那你应该删除那个 /home/torstein/.local/lib/python3.6/site-packages/ 目录(虽然以防万一,先备份它)。不,Conda 环境中的pip 仍应保留在环境中。你有PYTHONPATH 设置(当不在激活的环境中时)?
  • @merv:PYTHONPATH 未在 baseidp 中设置。我不知道它是否设置为 before conda 在终端启动时运行自动PATH 操作。删除(或重命名)/.local/lib/python3.6/site-packages/ 成功了。没有必要创建一个新的环境。谢谢!

标签: python python-3.x anaconda conda


【解决方案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 以某种方式配置了 env。

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

立即解决

您需要以某种方式摆脱这种依赖。有一些事情可以尝试

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

就个人而言,我想删除它并创建新的环境。可能很难知道你是如何与这个目录绑定在一起的,所以我会谨慎地假设其他包对那里的内容没有隐藏的依赖关系。

长期解决方法

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

export PYTHONNOUSERSITE=True

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

【讨论】:

    【解决方案2】:

    解决方法是:在anaconda\env\xyz(以及其他实现)中,将path环境变量设置为'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
    

    【讨论】:

    • Python 解释器是正确的解释器,正如您在帖子中看到的那样。
    • 这与推荐的做法相反。由于 Conda v.4.4 不应手动操作 PATH(请参阅 release notes)。
    猜你喜欢
    • 2016-11-28
    • 2020-03-14
    • 2021-09-06
    • 2017-09-07
    • 2013-12-03
    相关资源
    最近更新 更多