当前位置: 首页 > 面试题库 >

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

闻人业
2023-03-14
问题内容

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

使用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

分别$PATHbaseidp环境产生这些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


问题答案:

诊断

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

证据

我相信这是因为pandas正在从此处加载模块:

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

如果您签入Python

import sys

sys.path

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

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

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

立即解决

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

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

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

长期解决方法

GitHub问题的建议解决方法是添加以下环境变量,

export PYTHONNOUSERSITE=True

这样可以防止Conda加载其他本地site-packages目录。这样一来,您本来就不会遇到问题。



 类似资料:
  • 问题内容: 我有Anaconda在系统上工作,而VsCode在工作,但是在运行python脚本时如何使VsCode激活特定环境? 问题答案: 如果Anaconda是您的默认Python安装,则仅在安装Microsoft Python扩展后才可以使用 。 无论Python编辑器是什么,还是需要指向特定的安装,以下内容均应起作用: 在settings.json中使用类似以下内容编辑python.pat

  • 问题内容: 我在Windows 8上,使用Anaconda 1.7.5 64bit。 我创建了一个新的Anaconda环境 来自。 效果很好(有一个带有新python发行版的文件夹)。康达告诉我输入 激活环境,但是返回: 如何激活环境?我究竟做错了什么? 问题答案: 如果发生这种情况,则需要为您的环境设置PATH(以便从环境和Windows上的Scripts \中获取正确的Python)。 假设您

  • [机译]Conda 4.2.13 MacOSX 10.12.1 我正在尝试将程序包从安装到使用anaconda创建的新环境(虚拟)中。在Anaconda文档中,它说这很好。这与virtualenv的做法相同。 激活你想要放置程序的环境,然后安装一个程序。。。 我在Anaconda中创建了一个空环境,如下所示: 激活它: 然后,我可以在终端中看到我正在我的env中工作。问题来了,当我尝试安装一个包使

  • 我做了一个虚拟环境,我可以在命令提示符下激活它,但它不能用my_venv2\脚本\activate.bat激活它,我也不能在py魅力的终端中激活它

  • 我已经尝试了几个小时,但不知道如何在构建过程中在 Dockerfile 中激活和切换 anaconda 环境 这是初始代码: 起初,Docker 中的 anaconda 会抱怨 shell 设置不正确,因此在 conda 创建命令之后,我添加了: 在构建docker映像后运行这3个命令是可行的(即在调用docker run container-name后交互运行),但由于某种原因,在构建容器时不起

  • 不熟悉在虚拟环境中运行Python,会弄乱Django,无法激活虚拟环境。 在过去的4个小时里,试图在本地终端/VS代码上激活虚拟环境(venv),但运气不佳。 避免了“sudo pip install virtualenv”,因为我试图避免以root用户身份安装和使用不同的目录路径等。 使用缓存的virtualenv-20.0.31-py2.py3-none-any.whl(4.9 MB)收集v