Conda 为环境设置 LD_LIBRARY_PATH

40

我在miniconda3上安装了一个虚拟环境py35,我有一些库只想在这个环境中使用,所以它们都在该环境下。

 /.../miniconda3/envs/py35/libs

然而,它们在环境中并未被找到,因为LD_LIBRARY_PATH不包含该文件夹。现在我想在虚拟环境中设置LD_LIBRARY_PATH仅包含/lib。

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

2个回答

62

通过编辑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. 进入该目录并创建以下子目录和文件:

  3. 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
    
  4. 请按以下方式编辑./etc/conda/activate.d/env_vars.sh

  5. #!/bin/sh
    
    export MY_KEY='secret-key-value'
    export MY_FILE=/path/to/my/file/
    
  6. 按以下步骤编辑./etc/conda/deactivate.d/env_vars.sh

  7. #!/bin/sh
    
    unset MY_KEY
    unset MY_FILE
    

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


2
正是我所需要的。谢谢你。只有一个小修改,因为我添加了一些内容到 LD_LIBRARY_PATH 中,所以我不能使用 unset。相反,我在停用脚本中使用 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH/'PATH_I_ADDED/""}`。 - FlyingTeller
2
点赞,有用的东西。 创建环境时是否有一种方法可以做到这一点?似乎自动化部署不是正确的方式。 - E.Serra
1
@E.Serra 当环境创建时,会安装软件包,并使用 pre-linkpost-linkpost-unlink 脚本。 - darthbith
6
为什么conda不自动完成这个操作,有好的理由吗?毕竟,用户会期望能够通过激活环境来使用相互依赖的库。许多特定于环境的软件包都是共享库和用于其的Python封装,那么什么情况下你不想这样做呢?难道不应该始终优先考虑env-specific .so文件而不是其他位置吗? - Vineet Bansal
这个很有效,但应该与@Oleksandr的答案在这里结合使用。然而,它似乎对Jupyter笔记本没有影响 :-( - Gustavo Seabra
显示剩余4条评论

48
我只想补充一点,你可以在activate.d/env_vars.sh文件中声明2个变量,这样可以更容易地将变量重置为激活前的状态。
export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/your/path:${LD_LIBRARY_PATH}

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

export LD_LIBRARY_PATH=${OLD_LD_LIBRARY_PATH}
unset OLD_LD_LIBRARY_PATH

如果您需要保留原始值,强烈推荐这种方法。我一直在使用这个解决方案,效果很好。 - Kelsius
太棒了,运行得很好! - ameerosein
太棒了!谢谢。 - igorkf
1
请记住,如果您已经激活了环境并在修改文件后首先停用它,则会删除LD_LIBRARY_PATH变量。这刚刚发生在我身上,希望不会发生在其他人身上。 - clausmichele

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