Anaconda:永久包含外部包(类似于PYTHONPATH)

66

我知道如何使用conda install在Anaconda中安装包,也知道如何安装PyPi上的包,这在手册中有描述。

但是我该如何将包/文件夹永久地包含到Anaconda环境的PYTHONPATH中,以便可以导入我正在工作的代码,并在重新启动后仍然可用?

我目前的方法是使用sys

import sys
sys.path.append(r'/path/to/my/package')

这并不是很方便。

有什么提示吗?


我不明白“永久包含Anaconda中的软件包/文件夹,例如我当前正在使用的代码”是什么意思,您是指a) condapip没有将它们本地安装到正确的conda环境中(在这种情况下,请执行conda activate/deactivate直到进入正确的Python环境,您可能在conda中有几个环境),还是b) 您想手动捆绑第三方软件包与您的软件包(?听起来像一个可怕的想法,只需定义软件包依赖项)。 “永久”是什么意思,在哪台机器上? - smci
1
我只想让我正在工作的代码在特定环境中即使重启后也可用/可导入。因此,我已经提出了上面的问题。实际上,我已经找到了解决我的问题的不同方法,我已经在下面提供了它们。但是如果还有其他方法,请告诉我,我会添加它们! - Cord Kaldemeyer
4个回答

117

我在Anaconda论坛上找到了两个问题的答案:

1.) 将模块放入site-packages中,即目录$HOME/path/to/anaconda/lib/pythonX.X/site-packages,该目录始终在sys.path中。这也可以通过创建符号链接来实现。

2.) 将.pth文件添加到目录$HOME/path/to/anaconda/lib/pythonX.X/site-packages中。它可以命名为任何名称(只需要以.pth结尾)。一个.pth文件就是一个由完整路径名组成的以换行分隔的列,这些列在Python启动时将被添加到您的路径中。

或者,如果你只想链接到特定的conda环境,那么将.pth文件添加到~/anaconda3/envs/{NAME_OF_ENVIRONMENT}/lib/pythonX.X/site-packages/

两种方法都很简单,我选择了第二种选项,因为它更加灵活。

*** 更新:

3.) 使用conda develop,即conda-develop /path/to/module/来添加该模块,它会创建一个如选项2中描述的.pth文件。

4.) 在您的软件包文件夹中创建一个setup.py,并使用pip install -e /path/to/package进行安装,这是我认为最清洁的选项,因为您还可以使用pip list查看所有安装。请注意,选项-e允许编辑软件包代码。这里提供了更多信息。

无论如何,谢谢!


2
还在等待conda develop :/ - Austin A
3
“conda develop”基本上是一个脚本,可以实现第二个选项,现在似乎是有效的。 - Austin A
1
#2 对我似乎不起作用(我的目录结构似乎也不同;我没有多个python.X.X的选项,而且我的“lib”是大写的) - information_interchange
1
很可能造成这些目录结构差异的原因是Windows vs. Linux实现方式不同。在Windows下,Python构建sys.path时查找的位置略有不同。请参见https://docs.python.org/3/library/site.html。我相信在Windows中路径应该是`....path_to_anaconda/lib/site-packages`(大小写在Windows中也无关紧要)。 - mjv
2
请确保您首先运行conda install conda-build - user108569
显示剩余6条评论

13

我可以使用以下方式来包含本地模块:

conda-develop /path/to/module/

我希望它能有所帮助。


谢谢提示!我已经调整了我的答案,因为该命令只会创建一个 .pth 文件,如 2.) 中所述。 - Cord Kaldemeyer
2
提示(陷入困境):/path/to/module 不应包含模块名称,只需包括父目录的路径。 - Joshua R.
请注意:如果包中有一些需要编译的元素,例如Cython或f2py代码,您可以使用以下命令:python setup.py build_ext --inplace - Ariel Werle
@ArielWerle,你能永久删除sys.path中的路径吗(https://stackoverflow.com/questions/63011104/how-to-delete-a-certain-path-in-sys-path-in-anaconda-env-base)? - Joonho Park
1
"'conda-develop' 不被识别为内部或外部命令" - anishtain4

4

我认为最符合conda的本地化方式是在我的环境中创建env_vars.sh文件,如官方文档这里所述。

对于macOS和Linux用户,步骤如下:

  1. Go to your environment folder (e.g. /miniconda1/env/env_name). $CONDA_PREFIX is the environemnt variable for your environment path.

    cd $CONDA_PREFIX
    
  2. Create the activate.d and deactivate.d directories.

    mkdir -p ./etc/conda/activate.d
    mkdir -p ./etc/conda/deactivate.d
    
  3. Inside the each respective directory, create one env_vars.sh file. The one in the activate.d directory will set (or export) your environment variables when you conda activate your environment. The file in the deactivate.d directory will serve to unset the environment variables when you conda deactivate your environment.

    touch ./etc/conda/activate.d/env_vars.sh
    touch ./etc/conda/deactivate.d/env_vars.sh
    
  4. First edit the $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh to export the desired environment variables.

    #!/bin/sh
    
    export VAR_A='some-thing-here'
    export VAR_B=/path/to/my/file/
    
  5. Afterwards, open to edit the $CONDA_PREFIX/etc/conda/deactivate/env_vars.sh, in order to unset the env variables when you conda deactivate like so:

    #!/bin/sh
    
    unset VAR_A
    unset VAR_B
    

再次声明,我描述的内容直接来自 conda 文档,请在此处查看。


1

补充 Cord Kaldemeyer 上面的回答,关于第二个选项。如果你只想链接到特定的 conda 环境,那么请将 .pth 文件添加到 ~/anaconda3/envs/{NAME_OF_ENVIRONMENT}/lib/pythonX.X/site-packages/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接