if (Get-Module posh-venv) { return } function CompleteVenvName { param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) Get-ChildItem -Directory $env:WORKON_HOME | ForEach-Object { $_.Name } | Where-Object { $_ -Like "$wordToComplete*" } | Sort-Object } function venv { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [ValidateSet("list", "activate", "deactivate")] $command, [Parameter(Mandatory = $false)] [ArgumentCompleter({ CompleteVenvName @args })] $venv) switch ($command) { "list" { @(Get-ChildItem -Directory $env:WORKON_HOME | ForEach-Object { $name = $_.Name $version = (& "$_/Scripts/python.exe" --version).Replace("Python ", "") @{Name = $name; Version = $version; Path = $_ } }) | ForEach-Object { New-Object object | Add-Member -NotePropertyMembers $_ -PassThru } } "activate" { if (Test-Path "$env:WORKON_HOME/$venv/Scripts/activate.ps1") { & "$env:WORKON_HOME/$venv/Scripts/activate.ps1" } elseif ((!$venv -Or !$venv.Trim()) -And (Test-Path "venv/Scripts/activate.ps1")) { & "venv/Scripts/activate.ps1" } elseif (Test-Path (Join-Path $PWD $venv)) { & "$venv/Scripts/activate.ps1" } else { Write-Error "Environment '${venv}' does not exists." } } "deactivate" { deactivate } "list-python" { py -0 | Select-Object -Skip 1 } default { Write-Error "Unknown venv command ${args[0]}." } } }