在 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 包。
如果需要,您可以删除该行或更改它。
我使用 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 包。
如果需要,您可以删除该行或更改它。