【发布时间】:2021-11-08 08:30:32
【问题描述】:
我使用一个带有很多依赖项的 conda 环境和一些用 conda-build 编译的个人包。
在执行conda activate iota2_dev 时,我将更新$PATH 变量以向用户提出一些可执行文件。
activate.sh 脚本可用here
执行 conda 停用后,以下 /home/btardy/miniconda3/envs/iota2_dev/bin 仍在 $PATH 中。
但是在激活.sh ${CONDA_PREFIX}/lib/python3.6/site-packages/iota2:${CONDA_PREFIX}/lib/python3.6/site-packages/iota2/Common/Tools: 中添加的以下内容在 conda deactivate 后被很好地删除
查看/home/btardy/miniconda3/envs/iota2_dev/etc/conda/activate.d 中的所有激活脚本后,没有人更新$PATH 变量。
似乎在输入第一个 activate.sh 脚本时,$PATH 已经被修改为 /home/btardy/miniconda3/envs/iota2_dev/bin... 那么我们的激活/停用过程似乎运行良好。
问题是$PATH之前为什么以及如何修改,以及为什么最后没有重置。
如果我在我们的activate.sh 中评论$PATH 修改,则在 conda 停用后正确清除路径。但是我们失去了对可执行文件的简单访问。
发生了什么:
~$ echo $PATH
/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
~$ conda activate iota2_dev
(iota2) ~$ echo $PATH
/home/btardy/miniconda3/envs/iota2_dev/lib/python3.6/site-packages/iota2:/home/btardy/miniconda3/envs/iota2_dev/lib/python3.6/site-packages/iota2/Common/Tools:/home/btardy/miniconda3/envs/iota2_dev/bin:/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(iota2) ~$ conda deactivate
~$ echo $PATH
/home/btardy/miniconda3/envs/iota2_dev/bin:/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
应该发生什么:
~$ echo $PATH
/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
~$ conda activate iota2
(iota2) ~$ echo $PATH
/home/btardy/miniconda3/envs/iota2_dev/lib/python3.6/site-packages/iota2:/home/btardy/miniconda3/envs/iota2_dev/lib/python3.6/site-packages/iota2/Common/Tools:/home/btardy/miniconda3/envs/iota2_dev/bin:/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(iota2) ~$ conda deactivate
~$ echo $PATH
/home/btardy/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
对于包含其他包的环境(activate.sh 中没有 $PATH 修改),在 conda 停用后正确清除路径。 我没有发现 conda 如何本地存储和恢复 $PATH。我们可以在脚本中使用某个变量来正确恢复路径?
当没有 activate.sh 脚本可用时,有关 conda activate 行为的任何帮助或解释也会很有用。
这个问题也在conda github)
【问题讨论】:
-
听起来您是在直接修改激活脚本或类似的东西?您是否尝试过简单地在 activate.d 和 deactivate.d 中创建一个自定义脚本,如 here 所示?
-
是的。我们在进入激活脚本时存储 $PATH 内容。这里的问题是它已经被 conda 修改过了。而且我没有找到 conda 更新路径并存储初始 $PATH 值的位置......我刚刚在 activate.d 中添加了一个自定义脚本“activate.sh”,并且 PATH 也已经修改。这个问题似乎只与 PATH 密切相关,因为我们还修改了 LD_LIBRARY_PATH 并且它可以正常工作。