【发布时间】:2021-05-08 09:38:04
【问题描述】:
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 和 here,表示运行命令并返回到提示符,尽管这些引用指的是小写 /k。
下一个参数指向一个 bat 文件以激活 Anaconda 脚本。然后它将路径传递到名为“Anaconda3”的目录。我相当确定它作为最终参数传递的路径意味着它希望该路径可以访问,就好像它在用户或系统路径环境变量中一样。 Python.exe(Python 3)在这个目录下,还有一个_conda.exe和一个重要的Scripts文件夹,所以如果我们的系统或用户路径中没有我们的python,就是这样找到的,我是相当确定。
回到 .bat 文件,它做了很多事情。我一直认为 bats 是二进制文件,因为它们在系统上的行为方式,但它们实际上就像 Windows 的 Bash 脚本。它们是人类可读的,我的如下:
@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 文件时,当您单击启动快捷方式时,它变成了一个带有“(base)”前缀的 Anaconda 提示符,位于当前路径之前. (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 中使用所有 Conda environment management tools或 WSL。想了想,我现在不相信这是可能的。从天真的用户的角度来看,一种假设他们可以在任何地方运行任何程序,这是有道理的,或者在我们有子系统和系统内的系统之前,这是有道理的,但从更清醒的角度来看,Anaconda 是为Windows 和 C:\ProgramData\Anaconda3 目录内是 .exe 和 .bat 文件,而不是 Linux/WSL 兼容的二进制文件和 .sh 或 .bash 文件。这就像尝试再次运行 Windows_OS>Linux 子系统>Windows_file_,但它不是那样工作的。 WSL 和 Git Bash 在某种程度上甚至没有相同的路径结构。到目前为止,我的想法是否正确?
比起 Powershell 或 cmd,我更喜欢 Git Bash 和 WSL,而且我经常将它们用于 GCC 和 git。我在 VS Code 中完成大部分编码并在那里启动这些终端。如果存在这样的东西,我想充其量我可以为 git bash 或 wsl 安装 conda,但即便如此,它也可能无法与我的主要 Conda 对话或共享环境。否则,我可以尝试在环境中使用 venv,因为这似乎可以通过 python 在这些 shell 中工作,或者如果我真的想使用 Conda,则只需使用正常的命令提示符来执行所有操作。
我的评估是否正确?
感谢您的陪伴!要擅长某件事,您必须做到一切都一目了然,否则您可能会在最不想成为的时候迷失和困惑。
编辑:现在我回到了它,我重新发现了我原来的障碍:事实不能直接从 VS Code 使用 Conda 的命令提示符,或者一旦我启动正常的命令提示符后如何激活它。现在我至少知道 .bat 启动脚本,理论上每次都可以以这种方式激活它,但这有点尴尬,或者我可以从外部启动提示并导航到我的工作目录,但这也很笨拙。我忘记了这是我的第一个拦截器,在相关说明中,我在使用 x64 Native Tools(基于 Visual Studio 的命令提示符)时遇到了类似的问题。我也想知道那是什么,为什么它看起来像一个独立的终端,但我无法在 VS Code 中启动它。
【问题讨论】:
-
很好地挖掘了这一切
-
"...虽然这些引用指的是小写 /k。" Windows 不区分命令选项的大小写。
cmd /K和cmd /k将具有相同的效果。顺便说一句,文件名也是如此。
标签: shell anaconda command-prompt windows-subsystem-for-linux git-bash