Conda仅为env设置LD_LIBRARY_PATH

Fly*_*ler 24 python virtualenv anaconda

我安装了miniconda3,我创建了一个名为py35的虚拟环境.我有一些我只想在这个环境中使用的库.因此他们在

 /.../miniconda3/envs/py35/libs
Run Code Online (Sandbox Code Playgroud)

但是,由于LD_LIBRARY_PATH不包含所述文件夹,因此无法在环境中找到它们.我现在想要将LD_LIBRARY_PATH设置为仅当我在虚拟环境中时包含/ lib.

我正在考虑修改miniconda用于启动环境的激活脚本,但我不太确定这是否是标准做法,或者是否有更简单的方法来实现这一点.

dar*_*ith 32

通过编辑activate.d/env_vars.sh脚本激活环境时,可以设置环境变量.请参见:https://conda.io/docs/user-guide/tasks/manage-environments.html#macos-and-linux

该链接的关键部分是:

  1. 在终端窗口中找到conda环境的目录,例如/home/jsmith/anaconda3/envs/analytics.

  2. 输入该目录并创建这些子目录和文件:

    cd /home/jsmith/anaconda3/envs/analytics
    mkdir -p ./etc/conda/activate.d
    mkdir -p ./etc/conda/deactivate.d
    touch ./etc/conda/activate.d/env_vars.sh
    touch ./etc/conda/deactivate.d/env_vars.sh
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编辑./etc/conda/activate.d/env_vars.sh如下:

    #!/bin/sh
    
    export MY_KEY='secret-key-value'
    export MY_FILE=/path/to/my/file/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 编辑./etc/conda/deactivate.d/env_vars.sh如下::

    #!/bin/sh
    
    unset MY_KEY
    unset MY_FILE
    
    Run Code Online (Sandbox Code Playgroud)

运行时conda activate analytics,环境变量MY_KEY和MY_FILE将设置为您在文件中写入的值.运行时conda deactivate,这些变量将被删除.

  • 正是我要找的。谢谢你。由于我向`LD_LIBRARY_PATH` 添加了一些东西,所以只有很小的改动,我不能使用 unset。相反,我在停用脚本中执行 `export LD_LIBRARY_PATH=${LD_LIBRARY_PATH/'PATH_I_ADDED`/""}` (2认同)
  • 点赞,有用的东西。在创建环境时有没有办法做到这一点?自动化部署似乎不是正确的做法 (2认同)
  • 有充分的理由为什么conda不会自动执行此操作?毕竟,期望环境的用户能够通过激活环境来使用相互依赖的库。这些特定于环境的软件包中有许多都是共享库和python包装器,因此什么时候您不希望这样做?特定于env的.so文件不应该始终优先于其他位置吗? (2认同)

小智 19

我只是想补充一点,你可以在activate.d/env_vars.sh中声明2个变量,这样可以更容易地将变量重置为预激活状态:

export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/your/path:${LD_LIBRARY_PATH}
Run Code Online (Sandbox Code Playgroud)

然后在deactivate.d/env_vars.sh中:

export LD_LIBRARY_PATH=${OLD_LD_LIBRARY_PATH}
unset OLD_LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

  • 请记住,如果您激活了环境并在修改文件后首先将其停用,这将删除您的 LD_LIBRARY_PATH 变量。这只是发生在我身上,我希望它不会发生在别人身上。 (2认同)