Anaconda命令提示符看起来像普通的Windows命令提示符,它的开始菜单快捷方式可以追溯到Windows上C:\Windows\System32目录中的cmd.exe文件,所以我知道它只是命令提示符的一个示例,具有某些其他特性或功能。
当我点击“Anaconda Prompt”快捷方式的属性时,目标是"%windir%\System32\cmd.exe" /K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
,所以它有一些额外的参数,这些参数就是打开普通命令提示符和打开Anaconda的区别。
分解这些命令,here和here似乎描述了/k选项,表示运行命令并返回到提示符,尽管这些引用指的是小写/k。
下一个参数指向一个bat文件以激活Anaconda脚本。然后它传递一个名为“Anaconda 3”的目录的路径。我相当肯定它作为最后一个参数传递的路径意味着它希望这个路径可以被访问,就像它在用户或系统路径环境变量中一样。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%
正如我所料,当我在普通的(admin)命令提示符,它变成了一个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,这是我非常喜欢的终端。(我机器上唯一的Python)因为它似乎独立于安装它并为它管理包的程序而存在,但我特别希望使用Git Bash或WSL中的所有Conda environment management tools。经过思考,我现在不相信这是可能的。从一个天真的用户Angular 来看,一种假设他们可以在任何地方运行任何程序,这是有道理的,或者说在我们有子系统和系统中的系统之前是有道理的,但从更清楚的Angular 来看,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代码编写大部分代码,并在那里启动这些终端。我想如果存在这样的东西,我最多可以安装用于Git Bash或wsl的conda,但即使这样,它也可能无法与我的主Conda对话或共享环境。否则,我可以尝试使用venv作为环境。因为这似乎可以通过Python在这些shell中工作,或者如果我真的想使用Conda,就只使用普通的命令提示符来做所有的事情。
我的评估正确吗?
谢谢你一直支持我!要想做好某件事,你必须做到显而易见,否则你就有可能在你最不想做的时候迷失和困惑。
编辑:现在我又回到了这里,我重新发现了我最初的障碍:事实上,我无法直接从VS代码使用Conda的命令提示符,也无法在启动正常的命令提示符后激活它。现在我至少知道了.bat启动脚本,理论上可以每次都这样激活它,但这有点笨拙,或者我可以从外部启动一个提示符并导航到我的工作目录,但这也很笨拙。我忘了这是我的第一个拦截器,与此相关的是,我在使用x64 Native Tools(一个基于Visual Studio的命令提示符)时也遇到了类似的问题,我想知道那是什么,为什么它看起来像一个独立的终端,但我不能在VS代码中启动它。
2条答案
按热度按时间iqjalb3h1#
对于WSL,是的,你是对的。运行你为windows安装的
conda
和运行你为windows安装的任何其他程序是一样的-〉它会失败,因为二进制文件不兼容。你可能可以在那里安装linux版本,但正如你所指出的,那不是你想要的。对于git bash来说,解决方案比你想象的要简单,你可以设置它,这样你就可以和你的windows conda对话了,是的,你需要和你已经发现的
cmd
和powershell一样的设置,但是conda
已经有了你需要设置的一切。假设你的安装版本是
C:\Users\foo\miniconda3\
,在git bash中执行以下操作:这将修改你的bash_profile来自动设置conda以便在git bash中使用
一些澄清:
我现在不相信这是可能的。从一个天真的用户的Angular 来看,一种假设他们可以在任何地方运行任何程序,这是有意义的,或者说在我们有子系统和系统中的系统之前是有意义的,但从一个更清醒的Angular 来看,Anaconda是为Windows安装的,C:\ProgramData\Anaconda3目录中是.exe和.bat文件,而不是Linux/WSL兼容的二进制文件和.sh或.bash文件。这就像试图再次运行Windows_OS〉Linux子系统〉Windows_file_,但它不是这样工作的。WSL和Git Bash甚至没有相同的路径结构
正如你所指出的,wSL是一个子系统,而且由于wsl 2运行的是真实的的linux内核,所以很自然地,正如你所指出的,不可能从它运行windows二进制文件。
然而,Git bash根本不是一个子系统,而是bash的windows端口,这意味着当你在git bash中时,你仍然在你的windows环境中,只是路径和命令的语法不同(见上面我提供的命令),但你仍然在同一个系统中。
如果你看了文件
您还将看到它是一个普通的
.sh
脚本,它在因此ana/miniconda确实附带了一组sh脚本,您可以从Windows中的bash终端使用这些脚本
66bbxpm52#
对于wsl,尝试运行
conda.exe init bash