214 lines
6.7 KiB
PowerShell
214 lines
6.7 KiB
PowerShell
<#
|
|
.Synopsis
|
|
Activate a Python virtual environment for the current PowerShell session.
|
|
|
|
.Description
|
|
Pushes the python executable for a virtual environment to the front of the
|
|
$Env:PATH environment variable and sets the prompt to signify that you are
|
|
in a Python virtual environment. Makes use of the command line switches as
|
|
well as the `pyvenv.cfg` file values present in the virtual environment.
|
|
|
|
.Parameter VenvDir
|
|
Path to the directory that contains the virtual environment to activate. The
|
|
default value for this is the parent of the directory that the activate.ps1
|
|
script is located within.
|
|
|
|
.Parameter Prompt
|
|
The prompt prefix to display when this virtual environment is activated. By
|
|
default, this prompt is the name of the virtual environment folder (VenvDir)
|
|
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
|
|
|
.Example
|
|
activate.ps1
|
|
Activates the Python virtual environment that contains the activate.ps1 script.
|
|
|
|
.Example
|
|
activate.ps1 -Verbose
|
|
Activates the Python virtual environment that contains the activate.ps1 script,
|
|
and shows extra information about the activation as it executes.
|
|
|
|
.Example
|
|
activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
|
Activates the Python virtual environment located in the specified location.
|
|
|
|
.Example
|
|
activate.ps1 -Prompt "MyPython"
|
|
Activates the Python virtual environment that contains the activate.ps1 script,
|
|
and prefixes the current prompt with the specified string (surrounded in
|
|
parentheses) while the virtual environment is active.
|
|
|
|
.Notes
|
|
On Windows, it may be required to enable this activate.ps1 script by setting the
|
|
execution policy for the user. You can do this by issuing the following PowerShell
|
|
command:
|
|
|
|
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
|
|
For more information on Execution Policies:
|
|
https://go.microsoft.com/fwlink/?LinkID=135170
|
|
|
|
#>
|
|
Param(
|
|
[Parameter(Mandatory = $false)]
|
|
[String]
|
|
$VenvDir,
|
|
[Parameter(Mandatory = $false)]
|
|
[String]
|
|
$Prompt
|
|
)
|
|
|
|
function Get-PyVenvConfig(
|
|
[String]
|
|
$ConfigDir
|
|
) {
|
|
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
|
|
|
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
|
|
|
$pyvenvConfig = @{ }
|
|
|
|
if ($pyvenvConfigPath) {
|
|
Write-Verbose "File exists, parse ``key = value`` lines"
|
|
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
|
|
|
$pyvenvConfigContent | ForEach-Object {
|
|
$keyval = $PSItem -split "\s*=\s*", 2
|
|
if ($keyval[0] -and $keyval[1]) {
|
|
$val = $keyval[1]
|
|
|
|
if ("'""".Contains($val.Substring(0, 1))) {
|
|
$val = $val.Substring(1, $val.Length - 2)
|
|
}
|
|
|
|
$pyvenvConfig[$keyval[0]] = $val
|
|
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
|
}
|
|
}
|
|
}
|
|
return $pyvenvConfig
|
|
}
|
|
|
|
function global:deactivate([switch] $NonDestructive) {
|
|
if (Test-Path variable:_OLD_VIRTUAL_PATH) {
|
|
$env:PATH = $variable:_OLD_VIRTUAL_PATH
|
|
Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
|
|
}
|
|
|
|
if (Test-Path variable:_OLD_VIRTUAL_TCL_LIBRARY) {
|
|
$env:TCL_LIBRARY = $variable:_OLD_VIRTUAL_TCL_LIBRARY
|
|
Remove-Variable "_OLD_VIRTUAL_TCL_LIBRARY" -Scope global
|
|
} else {
|
|
if (Test-Path env:TCL_LIBRARY) {
|
|
Remove-Item env:TCL_LIBRARY -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
|
|
if (Test-Path variable:_OLD_VIRTUAL_TK_LIBRARY) {
|
|
$env:TK_LIBRARY = $variable:_OLD_VIRTUAL_TK_LIBRARY
|
|
Remove-Variable "_OLD_VIRTUAL_TK_LIBRARY" -Scope global
|
|
} else {
|
|
if (Test-Path env:TK_LIBRARY) {
|
|
Remove-Item env:TK_LIBRARY -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
|
|
if (Test-Path variable:_OLD_PKG_CONFIG_PATH) {
|
|
$env:PKG_CONFIG_PATH = $variable:_OLD_PKG_CONFIG_PATH
|
|
Remove-Variable "_OLD_PKG_CONFIG_PATH" -Scope global
|
|
}
|
|
|
|
if (Test-Path function:_old_virtual_prompt) {
|
|
$function:prompt = $function:_old_virtual_prompt
|
|
Remove-Item function:\_old_virtual_prompt
|
|
}
|
|
|
|
if ($env:VIRTUAL_ENV) {
|
|
Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
if ($env:VIRTUAL_ENV_PROMPT) {
|
|
Remove-Item env:VIRTUAL_ENV_PROMPT -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
|
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
|
}
|
|
|
|
if (!$NonDestructive) {
|
|
Remove-Item function:deactivate
|
|
Remove-Item function:pydoc
|
|
}
|
|
}
|
|
|
|
function global:pydoc {
|
|
& python -m pydoc $args
|
|
}
|
|
|
|
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
|
$VenvExecDir = Get-Item -Path $VenvExecPath
|
|
|
|
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
|
|
|
if ($VenvDir) {
|
|
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
|
} else {
|
|
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
|
Write-Verbose "VenvDir=$VenvDir"
|
|
}
|
|
|
|
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
|
|
|
if ($Prompt) {
|
|
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
|
} else {
|
|
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
|
Write-Verbose "Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
|
$Prompt = $pyvenvCfg['prompt']
|
|
} elseif (__VIRTUAL_PROMPT__ -ne "") {
|
|
$Prompt = __VIRTUAL_PROMPT__
|
|
} else {
|
|
$Prompt = Split-Path -Path $VenvDir -Leaf
|
|
}
|
|
}
|
|
|
|
deactivate -nondestructive
|
|
|
|
$env:VIRTUAL_ENV = $VenvDir
|
|
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
|
|
|
if (__TCL_LIBRARY__ -ne "") {
|
|
if (Test-Path env:TCL_LIBRARY) {
|
|
New-Variable -Scope global -Name _OLD_VIRTUAL_TCL_LIBRARY -Value $env:TCL_LIBRARY
|
|
}
|
|
$env:TCL_LIBRARY = __TCL_LIBRARY__
|
|
}
|
|
|
|
if (__TK_LIBRARY__ -ne "") {
|
|
if (Test-Path env:TK_LIBRARY) {
|
|
New-Variable -Scope global -Name _OLD_VIRTUAL_TK_LIBRARY -Value $env:TK_LIBRARY
|
|
}
|
|
$env:TK_LIBRARY = __TK_LIBRARY__
|
|
}
|
|
|
|
New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
|
|
|
|
if (Test-Path env:PKG_CONFIG_PATH) {
|
|
New-Variable -Scope global -Name _OLD_PKG_CONFIG_PATH -Value $env:PKG_CONFIG_PATH
|
|
}
|
|
$env:PKG_CONFIG_PATH = "$env:VIRTUAL_ENV\lib\pkgconfig;$env:PKG_CONFIG_PATH"
|
|
|
|
$env:PATH = "$env:VIRTUAL_ENV/" + __BIN_NAME__ + __PATH_SEP__ + $env:PATH
|
|
|
|
if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
|
function global:_old_virtual_prompt {
|
|
""
|
|
}
|
|
$function:_old_virtual_prompt = $function:prompt
|
|
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
|
|
|
function global:prompt {
|
|
Write-Host -NoNewline -ForegroundColor Green "($($_PYTHON_VENV_PROMPT_PREFIX)) "
|
|
_old_virtual_prompt
|
|
}
|
|
}
|