Anacondaを設定して、conda init
とすると一通り、PowerShell Coreを含めたPowerShell用の設定もしてくれるのだが、この方法はPowerShellを立ち上げると毎回Anacondaが初期化されてしまう欠点がある。PowerShellで毎回Pythonを使うのであれば問題ないのだが、個人的な使用ケースとしてはPowerShellスクリプトのみで完結することも多く、これは非効率的になってしまう。
そのため、Initialize-Conda
というCmdletを作成することにした。内容的な以下のような感じ。C:/Path/to/Conda
をAnacondaの場所に変える。(GistでWindows版、Linux版を取得可能。)
function Initialize-Conda
{
$CONDA_ROOT_DIR = "C:/Path/to/Conda" # Change this
[System.Environment]::SetEnvironmentVariable("CONDA_EXE", "$CONDA_ROOT_DIR/Scripts/conda.exe", [System.EnvironmentVariableTarget]::Process)
[System.Environment]::SetEnvironmentVariable("_CE_M", "", [System.EnvironmentVariableTarget]::Process)
[System.Environment]::SetEnvironmentVariable("_CE_CONDA", "", [System.EnvironmentVariableTarget]::Process)
[System.Environment]::SetEnvironmentVariable("_CONDA_ROOT", "$CONDA_ROOT_DIR", [System.EnvironmentVariableTarget]::Process)
[System.Environment]::SetEnvironmentVariable("_CONDA_EXE", "$CONDA_ROOT_DIR/Scripts/conda.exe", [System.EnvironmentVariableTarget]::Process)
Import-Module -Scope Global "$Env:_CONDA_ROOT/shell/condabin/Conda.psm1"
conda activate base
}
環境変数の設定が冗長になっているのは、通常の変数はスクリプト外にスコープを持たないため。.NETのSetEnvironmentVariable
をprocess
のスコープで初期化することにより対応している。(LinuxではCONDA_EXE
と_CONDA_EXE
は$CONDA_ROOT_DIR/bin/conda
とすること。)
尚、Add-CondaEnvironmentToPrompt
を使うとプレフィックスとしてConda環境をプロンプトに追加することができるが、挙動が曖昧だったので、今回は割愛している。
これに対応するPSD1は以下の通り。(Gistでも公開。)
@{
RootModule = 'Conda.psm1'
ModuleVersion = '1.0.0.0'
FunctionsToExport = @(
'Initialize-Conda'
)
CmdletsToExport = '*'
VariablesToExport = '*'
AliasesToExport = '*'
GUID = '23421dee-ca6f-4847-9c93-1268c629964a'
Author = 'Hideki Saito'
Description = 'Anaconda Initializer'
PowerShellVersion = '6.0'
CompatiblePSEditions = 'Core'
Copyright = '(c) 2019 Hideki Saito. All rights reserved.'
PrivateData = @{
PSData = @{
ProjectUri = ''
ReleaseNotes = ''
}
}
}
このファイルをそれぞれConda.psm1
、Conda.psd1
として、Documents\PowerShell\Modules\Conda
以下(Linuxでは~/.local/share/powershell/Modules/Conda
)に配置すると、Initialize-Conda
を読み出せるようになる。