【问题标题】:Unexpected Python paths in Conda environmentConda 环境中的意外 Python 路径
【发布时间】:2022-11-29 14:31:16
【问题描述】:

在 Conda 环境中(此处为 base),我对 Python 路径中目录的顺序感到惊讶:

python -c "import sys; print(sys.path)"
['', 
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python37.zip',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/lib-dynload',
'/export/home/db291g/.local/lib/python3.7/site-packages',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages']

如您所见,我的本地非 Conda 路径:

/export/home/db291g/.local/lib/python3.7/site-packages

出现在 Conda 对手之前:

/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages

这意味着如果在 .local/lib/python3.7/site-packages 中也找到安装在 miniconda3/lib/python3.7/site-packages 中的 Python 包,它们将被忽略。事实上,在.local/lib/python3.7/site-packages 我有numpy v1.20,但在 Conda 环境中我需要 v1.19,它已正确安装,但已被 v1.20 取代。这似乎违背了使用 Conda 的意义。

我的配置有问题还是我在这里遗漏了什么?

一些信息:

which python
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/python

python -V
Python 3.7.12

which conda
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/conda

conda --version
conda 4.11.0

【问题讨论】:

    标签: python path conda


    【解决方案1】:

    这是预期的行为(参见PEP 370),部分原因是Anaconda recommended against user-level package installations

    The site module 负责在 Python 初始化时设置 sys.pathThe code in site.py 专门在附加前缀站点之前附加用户站点,这就是导致这种优先级排序的原因。根据 PEP 370 的动机是用户将在系统级安装 Python,但希望优先安装他们在用户级安装的包,因此用户站点应该在前缀站点之前加载。

    选项

    有几个选项可以避免加载用户级站点包。

    1:环境变量

    环境变量PYTHONNOUSERSITE 将切换加载用户级别site-packages。即,

    PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
    

    2:Python -s标志

    或者,Python 二进制文件有一个 -s 参数来专门禁用用户级站点包。

    python -s -c "import sys; print(sys.path)"
    

    3:删除(并避免将来)用户级安装

    The Conda recommendation 是为了完全避免pip install --user,这将被解释为应该从系统中删除~/.local/lib/python* 文件夹。

    4:自动化Conda环境变量

    Conda Forge 包

    The Conda Forge package conda-ecosystem-user-package-isolation 将在环境激活期间自动设置PYTHONNOUSERSITE=1

    如果您希望所有环境默认都具有这种隔离,请考虑将其添加到 create_default_packages 配置列表中:

    conda config --add create_default_packages conda-ecosystem-user-package-isolation
    

    请注意,此包还设置了R_LIBS_USER="-",将任何 R 环境与用户级包隔离开来。

    替代套餐

    如果您想要更细化的选项,我还创建了单独的包,仅设置 PYTHONNOUSERSITE=1PYTHONPATH="" 环境变量,可以通过以下方式安装:

    ## set PYTHONNOUSERSITE=1
    conda install merv::envvar-pythonnousersite-true
    
    ## clear PYTHONPATH
    conda install merv::envvar-pythonpath-null
    

    【讨论】:

    • 感谢您的详尽回答。您的选项 3(删除~/.local/lib/python*)可能过于激进。在我看来,通常应该以 conda activate my-env && export PYTHONNOUSERSITE=1 开头,这样您要么导入您在环境中安装的内容,要么因有意义的导入错误而失败。当前的行为非常棘手......!
    • @dariober 添加了另一个选项:通过 Conda 包自动设置环境变量。这有点像我一直想尝试一段时间的概念验证。对于那些仍然想要用户站点并想要一个快速解决方案来隔离他们的 Conda 环境的人来说可能会有用。
    • 这看起来像我想要的答案,但它对我不起作用。当我对 python(版本 3.9.13)使用 -s 选项时,该路径仍然有一些本地目录。我找不到那些本地目录的来源(我的环境中没有 conda.pth,环境目录树中的任何地方都没有明显的地方,等等)。
    • 根据我自己的评论,我发现这个文件可能是悲伤的根源: /Users/michael/miniconda3/envs/itr_env_vanilla/lib/python3.9/site-packages/easy-install.pth 。我的问题是:谁安装了那个?
    • @MichaelTiemann 如果它是一个 Conda 包,那么应该在环境的 conda-meta/ 文件夹中找到的包的 JSON 文件中描述该文件。 grep 'easy-install.pth' /Users/michael/miniconda3/envs/itr_env_vanilla/conda-meta/* 之类的东西应该可以识别包。
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2011-01-10
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多