水蟒不使用来自激活环境的包

2024-06-12 13:40:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个conda环境,在bash终端中,有一个Intel Python发行版解释器。但是,在导入包时,它们是从系统默认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)是从正确的路径导入的:

^{pr2}$

.bashrc的相关部分(路径中没有显式设置Python):

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

对于base和{}环境,分别产生这些{}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


Tags: pathpandashomebin环境libusrlocal
2条回答

诊断

PATH中似乎有(或已经有)另一个python3.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。在

另外,python3.7env不受影响的事实很可能是因为您不能跨不同的次要版本加载模块。在

即时解决方案

你需要摆脱这种依赖。有一些事情可以尝试

  1. 从您的PATH中删除{}。不过,这可能会引发其他问题。大概您在PATH中有它,因为那里还有其他非开发的东西。在
  2. 专门转储site-packages目录。在评论中,有人说,这是一个不再使用的全局Python安装的残余,所以去掉它似乎是件好事。不过,一定要备份它,以防有其他依赖关系。在
  3. 导入模块之前,请从sys.path中清除此路径。不确定一个干净的方法来做这件事。在

就个人而言,我想删除它并创建新的env。很难知道您是如何绑定到这个目录中的,所以我要谨慎地假设其他包对其中的内容没有隐藏的依赖关系。在

长期解决方案

来自the GitHub issue的建议解决方法是添加以下环境变量

^{pr2}$

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

解决方案是:在anaconda\env\xyz(以及其他实现中),将path环境变量设置为python.exe'已安装。在

默认情况下python.exe水蟒中的文件位于:

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

显然,在您这样做之后,python命令会起作用,在我的例子中,会产生以下结果。在

^{pr2}$

相关问题 更多 >