打开不同于命令提示符的 "Anaconda" 提示符是什么意思,如何打开?

What does it mean to open an "Anaconda" prompt distinct from command prompt and how to?

Anaconda 命令提示符看起来像普通的 windows 命令提示符,它的开始菜单快捷方式可以追溯到 C:\Windows\System32 目录中 windows 上的 cmd.exe 文件,所以我知道它只是具有某些其他特征或功能的命令提示符的一个实例。我很好奇所有这些其他方面是什么。

当我点击“Anaconda Prompt”快捷方式的属性时,目标是 "%windir%\System32\cmd.exe" /K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3 因此它有一些额外的参数。在这些论点中,打开普通命令提示符和 Anaconda 之间的区别。

分解这些命令,/k 选项似乎被描述为 here and here 表示 运行 命令,return 表示提示符,尽管这些引用指的是小写字母/k.

下一个参数指向一个bat文件来激活一个Anaconda脚本。然后它将路径传递到名为“Anaconda3”的目录。我相当确定它作为最终 arg 传递的路径意味着它希望可以访问该路径,就好像它在用户或系统路径环境变量中一样。 Python.exe (Python 3) 在这个目录下,还有一个 _conda.exe 和一个重要的 Scripts 文件夹,所以如果我们在系统中没有我们的 python 或者用户路径,就是这样找到的,我很确定。

回到.bat 文件,这做了很多事情。我一直认为蝙蝠是二进制文件,因为它们在系统上的作用方式,但它们实际上就像 Bash Windows 的脚本。它们是人类可读的,我的如下:

@set "_args1=%1"
@set _args1_first=%_args1:~0,1%
@set _args1_last=%_args1:~-1%
@set _args1_first=%_args1_first:"=+%
@set _args1_last=%_args1_last:"=+%
@set _args1=

@if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" (
    @CALL "%~dp0..\condabin\conda.bat" activate
    @GOTO :End
)

@REM This may work if there are spaces in anything in %*
@CALL "%~dp0..\condabin\conda.bat" activate %*

:End
@set _args1_first=
@set _args1_last=

这个 .bat 使用它自己的代码调用附近目录中的另一个 .bat“conda.bat”:

@IF NOT DEFINED _CE_CONDA (
  @SET _CE_M=
  @SET "CONDA_EXE=%~dp0..\Scripts\conda.exe"
)
@IF [%1]==[activate]   "%~dp0_conda_activate" %*
@IF [%1]==[deactivate] "%~dp0_conda_activate" %*

@SETLOCAL EnableDelayedExpansion
@IF DEFINED _CE_CONDA (
  @REM when _CE_CONDA is defined, we're in develop mode.  CONDA_EXE is actually python.exe in the root of the dev env.
  FOR %%A IN ("%CONDA_EXE%") DO @SET _sysp=%%~dpA
) ELSE (
  @REM This is the standard user case.  This script is run in root\condabin.
  FOR %%A IN ("%~dp0.") DO @SET _sysp=%%~dpA
  IF NOT EXIST "!_sysp!\Scripts\conda.exe" @SET "_sysp=!_sysp!..\"
)
@SET _sysp=!_sysp:~0,-1!
@SET PATH=!_sysp!;!_sysp!\Library\mingw-w64\bin;!_sysp!\Library\usr\bin;!_sysp!\Library\bin;!_sysp!\Scripts;!_sysp!\bin;%PATH%
@SET CONDA_EXES="%CONDA_EXE%" %_CE_M% %_CE_CONDA%
@CALL %CONDA_EXES% %*
@ENDLOCAL

@IF %errorlevel% NEQ 0 EXIT /B %errorlevel%

@IF [%1]==[install]   "%~dp0_conda_activate" reactivate
@IF [%1]==[update]    "%~dp0_conda_activate" reactivate
@IF [%1]==[upgrade]   "%~dp0_conda_activate" reactivate
@IF [%1]==[remove]    "%~dp0_conda_activate" reactivate
@IF [%1]==[uninstall] "%~dp0_conda_activate" reactivate

@EXIT /B %errorlevel%

正如我所料,当我在一个普通的(管理员)命令提示符下调用 activate.bat 文件时,它变成了一个 Anaconda 提示符,在我当前路径之前你得到的是“(base)”前缀单击启动快捷方式。 (base) C:\Users\User>。有趣的是,这样做似乎只在常规命令提示符下有效,而不是 Git Bash、WSL 甚至 Powershell,尽管有一个单独的 Powershell 启动器可以工作。在其属性中,它具有以下目标: %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\ProgramData\Anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\ProgramData\Anaconda3' "
如果你 运行 ps1 文件(类似脚本的 powershell),它具有将你带入 conda 环境的相同效果,因为你可以 运行 'conda' 命令并出现帮助说明。

这是 ps1 代码。

$Env:CONDA_EXE = "C:/ProgramData/Anaconda3\Scripts\conda.exe"
$Env:_CE_M = ""
$Env:_CE_CONDA = ""
$Env:_CONDA_ROOT = "C:/ProgramData/Anaconda3"
$Env:_CONDA_EXE = "C:/ProgramData/Anaconda3\Scripts\conda.exe"

Import-Module "$Env:_CONDA_ROOT\shell\condabin\Conda.psm1"
Add-CondaEnvironmentToPrompt

无论如何,这只是我在过去几个小时的研究中了解到的背景信息,因为我想做我的家庭作业。我想知道当您通过 Anaconda 打开命令提示符时,Conda 在 Windows 中正在做什么。我很确定它在做两件主要的事情:为会话设置路径以包含 C:\ProgramData\Anaconda3 目录,并激活它的基础环境或您告诉它启动的任何其他虚拟环境,您可能已经通过创建它在某个时候,但它还有其他值得注意的事情吗?

我问这个不仅仅是因为我很好奇到底发生了什么(我是),而且我也希望在 Git Bash 和 WSL 中与 Conda 一起工作,终端我真的像。我目前可以将 Conda 的 Python 与它们一起使用(我机器上唯一的 Python),因为它似乎独立于安装它并为其管理包的程序而存在,但我特别希望使用Git Bash 或 WSL 中的所有 Conda environment management tools。想了想,我现在不相信这是可能的。从天真的用户的角度来看,一种假设他们可以 运行 任何地方的任何程序,这在我们拥有子系统和系统内的系统之前是有意义的,或者本来是有意义的,但从一个更有意识的角度来看, Anaconda 是为 Windows 安装的,在 C:\ProgramData\Anaconda3 目录中是 .exe 和 .bat 文件,而不是 Linux/WSL 兼容的二进制文件和 .sh 或 .bash 文件。这就像尝试 运行 Windows_OS>Linux subsystem>Windows_file_again,但它不是那样工作的。 WSL 和 Git Bash 甚至没有相同的路径结构。到目前为止,我的想法是否正确?

与 Powershell 或 cmd 相比,我更喜欢 Git Bash 和 WSL,我经常将它们用于 GCC 和 git。我在 VS Code 中完成大部分编码并在那里启动这些终端。我想充其量我可以为 git bash 安装 conda 或 wsl 如果存在这样的东西,但即使那样它也可能无法与我的主要 Conda 对话或共享环境。否则,我可以尝试在环境中使用 venv,因为它似乎可以通过 python 在这些 shell 中工作,或者如果我真的想使用 Conda,则只需使用普通命令提示符即可完成所有操作。

我的评估是否正确?

感谢您的支持!要擅长某事,您必须达到显而易见的地步,否则您 运行 有在您最不想成为的时候迷失和困惑的风险。

编辑:现在我又回来了,我重新发现了我最初的障碍:事实是无法直接从 VS Code 使用 Conda 的命令提示符,也无法在启动正常命令提示符后如何激活它。现在我至少知道 .bat 启动脚本并且理论上可以每次都以这种方式激活它,但这有点尴尬,或者我可以在外部启动提示并导航到我的工作目录,但这也很笨拙。我忘记了这是我的第一个拦截器,并且在相关说明中,我在使用 x64 Native Tools(基于 Visual Studio 的命令提示符)时遇到了类似的问题。我也想知道那是什么,为什么它看起来像一个独立的终端,但我无法在 VS Code 中启动它。

对于 WSL,是的,你是对的。 运行 您为 windows 安装的 conda 与尝试 运行 您为 windows 安装的任何其他程序相同 -> 它会失败,因为二进制文件不兼容。您可能可以在那里安装 linux 版本,但正如您所指出的,那不是您想要的。

对于git bash,解决方案比您想象的要简单。您可以对其进行设置,以便您可以与 windows 安装的 conda 进行“对话”。是的,您需要对 cmd 和 powershell 进行相同的设置,但是 conda 已经具备设置它所需的一切。

假设您的安装位于 C:\Users\foo\miniconda3\,从您的 git bash,执行:

/c/Users/foo/miniconda3/Scripts/activate
conda init bash

这将修改您的 bash_profile 以自动设置 conda 以供从 git bash

使用

一些说明:

I now don't believe this is possible. From a naive user perspective, one sort of assumes they can run any program anywhere, and that makes sense or would have made sense before we had sub-systems and systems within systems, but from a more aware point of view, Anaconda was installed for Windows and inside the C:\ProgramData\Anaconda3 directory are .exe and .bat files, not Linux/WSL compatible binaries and .sh or .bash files. It's like trying to run Windows_OS>Linux subsystem>Windows_file_again, but it doesn't work like that. WSL and Git Bash don't even have the same path structure somehow

正如您所指出的,WSL 是一个子系统,并且自从 wsl 2 运行s a real linux kernel 以来。自然而然,正如您所说,不可能从中 运行 windows 二进制文件。

然而,

Git bash 根本不是一个子系统。相反,它是 windows 的 bash 端口。这意味着当您处于 git bash 时,您仍然处于 windows 环境中。只有路径和命令的语法不同(见上面我提供的命令),但你仍然在同一个系统中。

如果您查看文件

C:\Users\foo\miniconda3\Scripts\activate

您还会看到这是一个普通的 .sh 脚本,它在

调用 conda.sh
C:\Users\a-fjochhe\miniconda3\etc\profile.d\conda.sh

所以 ana/miniconda 确实附带了一组 sh 脚本,您可以在 Windows

中的 bash 终端使用这些脚本