在 powershell 中更改文件夹时 Conda 会自动更改环境

Conda change environment automatically when changing folder in powershell

我使用 PowerShell 和 python。因为我有多个项目,所以我也有多个 conda 环境。

我想创建一种方法来根据文件夹自动更改我的环境。 目前,我编码:

function conda_here {
  $first_line = Get-Content -Head 1 environment.yml  # This returns "name: conda_env_name"
  $env_name = $first_line.Split(": ")[-1]  # This splits it into an array of [name, : , conda_env_name] and takes the last element
  try {
    conda activate $env_name
  } catch {
    Write-Host "Tried to activate environment $env_name, but failed." -ForeGroundColor Red
  }
}

function cda () {
    set-location @args 
    if ( Test-Path environment.yml ){
        conda_here 
    }
}

所以我用cda my_folder.

问题,当我直接进入文件夹(使用 Pycharm、VSCode 或使用终端打开)时 cda 不起作用(它“高达 ~” ).我更喜欢“覆盖”cd,但在将 cda 更改为 cd 时它不起作用。

你有什么想法吗?

这是 prompt 函数的一个很好的用途。此 get 在 PowerShell 中的任何操作之后执行,并且还会呈现 PowerShell 提示符。

这是 PowerShell 中的基本部分。

function prompt { 'PS ' + $(get-location) + '> ' }

这是一个更高级的模块,它附带了很棒的 DBA 工具 PowerShell 模块。

function Prompt
{
    Write-Host "[" -NoNewline
    Write-Host (Get-Date -Format "HH:mm:ss") -ForegroundColor Gray -NoNewline
    
    try
    {
        $history = Get-History -ErrorAction Ignore
        if ($history)
        {
            Write-Host "][" -NoNewline
            if (([System.Management.Automation.PSTypeName]'Sqlcollaborative.Dbatools.Utility.DbaTimeSpanPretty').Type)
            {
                Write-Host ([Sqlcollaborative.Dbatools.Utility.DbaTimeSpanPretty]($history[-1].EndExecutionTime - $history[-1].StartExecutionTime)) -ForegroundColor Gray -NoNewline
            }
            else
            {
                Write-Host ($history[-1].EndExecutionTime - $history[-1].StartExecutionTime) -ForegroundColor Gray -NoNewline
            }
        }
    }
    catch { }
    Write-Host "] $($executionContext.SessionState.Path.CurrentLocation.ProviderPath)" -NoNewline
    "> "
}

现在,如果您只想使用基本的正常提示和 运行 您的代码,这就是它的工作方式。

function prompt { 'PS ' + $(get-location) + '> ' 
    if ( Test-Path environment.yml ){
        conda_here 
    }
}

这样,当您更改目录时,您的代码将自动 运行。如果目录中包含 environment.yml,它会自动为您调用 conda_here

要在启动 PowerShell 时将其保存为默认设置,请将其添加到您的 PowerShell 配置文件中。

最后,我在检查一些“改变 CD 行为”时找到了解决方案。这是我的成功:

function conda_here {
  $first_line = Get-Content -Head 1 environment.yml
  $env_name = $first_line.Split(': ')[-1] 
  try { conda activate $env_name }
  catch { Write-Host "Tried to activate environment $env_name, but failed." -ForegroundColor Red }
}

if (Test-Path environment.yml) { conda_here }

function cda () {
  Set-Location @args 
  if (Test-Path environment.yml) { conda_here }
  else { conda activate Root }    
}

Set-Item Alias:cd cda

我把这个放在我的 $PROFILE

注意:Root 是我的 conda“基本”(我不使用 base),因为我有时使用没有特定 project/code 的 pip 包。 如果需要,您可以删除该行或更改它。