【问题标题】:Env $PATH has not the correct value after conda deactivate环境 $PATH 在 conda deactivate 后没有正确的值
【发布时间】: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 并且它可以正常工作。

标签: python linux conda


【解决方案1】:

我快速浏览了一下。似乎conda 在调用activate.d 中的任何内容之前对PATH 进行了自己的修改,但也在调用deactivate.d 中的任何内容之前,所以当你在activate.d\test.sh 中有类似的东西时

echo ${PATH}
export OLD_PATH=${PATH}

export PATH=/usr/users/dummy/testdir:${PATH}

您将在OLD_PATH 中拥有您环境的bin 目录。因此,当您在 deactivate.d\test.sh 中执行类似操作时

export PATH=${OLD_PATH}

然后您将在 conda 清除后将 bin 目录添加到 PATH。我能想到的直接解决您的问题的唯一方法是在您的 activate.d 脚本中修剪已经添加的前缀 PATH,如下所示:

export OLD_PATH=$(echo ${PATH} | sed 's/^[^:]*://g')

但是

我个人不太喜欢这种解决方案。您依赖于这样一个事实,即 conda 只会在 PATH 中添加一个条目,这可能是一个稳定的假设,也可能不是一个稳定的假设。我不是 conda 配方方面的专家,但我相当确定将脚本复制到 env 的实际 bin 目录(自动添加到 PATH)并将它们作为入口点应该不会太难你的代码。

【讨论】:

  • 感谢您的回答@FlyingTeller。我同意修剪$PATH 不是一个优雅的解决方案。我为入口点创建别名而不是修改$PATH,然后在 deactivate.sh 中取消它们的别名。另一种解决方案是警告用户在停用环境后关闭终端以避免$PATH中的冲突@
猜你喜欢
  • 2017-06-21
  • 2019-04-26
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多