gpt4 book ai didi

linux - Conda activate.d 和 deactivate.d 不符合我的预期

转载 作者:行者123 更新时间:2023-12-03 10:00:19 30 4
gpt4 key购买 nike

我正在尝试通过使用 activate.d 和 deactivate.d 来修改 conda 中的 $PATH 变量,例如:
在激活.d 中:

export OLD_PATH = $PATH
export PATH= "/path/to/something:$PATH"
在 deactivate.d 中:
export PATH = $OLD_PATH
unset OLD_PATH
基地 环境, echo $PATH输出:
(base) $ echo $PATH
/home/myname/anaconda3/bin:/home/myname/anaconda3/condabin:/home/myname/bin:/home/myname/.local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/cuda-8.0/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/sbin
然后我通过以下方式激活我的环境:
(base) $ conda activate myproject
我的项目 环境, echo $PATH输出:
(myproject) $ echo $PATH
/path/to/something:/home/myname/anaconda3/envs/myproject/bin:/home/myname/anaconda3/condabin:/home/myname/bin:/home/myname/.local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/cuda-8.0/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/sbin
这正是我所期望的。但是,当我尝试返回 基地 通过使用环境
(myproject) $ conda deactivate
我期望的是 echo $PATH将输出与 中相同的内容基地 环境。但是,我得到的是:
(base) $ echo $PATH
/home/myname/anaconda3/envs/myproject/bin:/home/myname/anaconda3/condabin:/home/myname/bin:/home/myname/.local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/cuda-8.0/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/sbin
请注意,第一个路径是 /home/myname/anaconda3/envs/myproject/bin而不是 /home/myname/anaconda3/bin .
那里发生了什么事?

最佳答案

不对称破坏了可逆性
问题是 Conda 也在操纵 PATH变量和脚本运行的顺序与正确的逆运算不一致。即,激活和停用的操作顺序是:

  • 更新环境变量(包括 PATH )
  • etc/conda/(de)activate.d 中运行脚本文件夹。

  • 为了与逆运算一致,需要运算的对称性。也就是说,activate 应该做 (1) 然后 (2),而 deactivate 应该做 (2) 然后 (1)。
    相反,发生的是 OLD_PATH你保存后实际对应 PATH被操纵以激活环境。
    解决方法
    而不是试图捕获 OLD_PATH ,您只能跟踪停用脚本中添加的内容和删除内容。例如,像
    activate.d 脚本
    export MY_ADDED_PATH="/path/to/something"
    export PATH="$MY_ADDED_PATH:$PATH"
    deactivate.d 脚本
    # Credit for escaping: https://unix.stackexchange.com/a/129063/148899
    escaped_lhs=$(printf '%s\n' "$MY_ADDED_PATH:" | sed 's:[][\\/.^$*]:\\&:g')
    export PATH=$(echo "$PATH" | sed "s/$escaped_lhs//")
    unset MY_ADDED_PATH
    这似乎对我有用 osx-64 .

    调试提示
    Conda 处理起来很麻烦,因为它是 shell 函数和 Python 的混合体。然而,其中一件巧妙的事情是 Conda 入口点(例如 bin/conda )具有一些返回 shell 命令字符串的内部函数。
    具体来说,当运行命令 conda activate foo 时,可以检查将在 shell 中运行的内容。 , 使用
    $CONDA_EXE shell.posix activate foo
    相似地,
    $CONDA_EXE shell.posix deactivate
    将列出停用的操作。这并不是 Conda 在激活和停用方面所做的全部,但它涵盖了大部分内容。

    关于linux - Conda activate.d 和 deactivate.d 不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63721599/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com