Mercurial > repos > shellac > sam_consensus_v3
comparison env/bin/Activate.ps1 @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
| author | shellac |
|---|---|
| date | Mon, 22 Mar 2021 18:12:50 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4f3585e2f14b |
|---|---|
| 1 <# | |
| 2 .Synopsis | |
| 3 Activate a Python virtual environment for the current PowerShell session. | |
| 4 | |
| 5 .Description | |
| 6 Pushes the python executable for a virtual environment to the front of the | |
| 7 $Env:PATH environment variable and sets the prompt to signify that you are | |
| 8 in a Python virtual environment. Makes use of the command line switches as | |
| 9 well as the `pyvenv.cfg` file values present in the virtual environment. | |
| 10 | |
| 11 .Parameter VenvDir | |
| 12 Path to the directory that contains the virtual environment to activate. The | |
| 13 default value for this is the parent of the directory that the Activate.ps1 | |
| 14 script is located within. | |
| 15 | |
| 16 .Parameter Prompt | |
| 17 The prompt prefix to display when this virtual environment is activated. By | |
| 18 default, this prompt is the name of the virtual environment folder (VenvDir) | |
| 19 surrounded by parentheses and followed by a single space (ie. '(.venv) '). | |
| 20 | |
| 21 .Example | |
| 22 Activate.ps1 | |
| 23 Activates the Python virtual environment that contains the Activate.ps1 script. | |
| 24 | |
| 25 .Example | |
| 26 Activate.ps1 -Verbose | |
| 27 Activates the Python virtual environment that contains the Activate.ps1 script, | |
| 28 and shows extra information about the activation as it executes. | |
| 29 | |
| 30 .Example | |
| 31 Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv | |
| 32 Activates the Python virtual environment located in the specified location. | |
| 33 | |
| 34 .Example | |
| 35 Activate.ps1 -Prompt "MyPython" | |
| 36 Activates the Python virtual environment that contains the Activate.ps1 script, | |
| 37 and prefixes the current prompt with the specified string (surrounded in | |
| 38 parentheses) while the virtual environment is active. | |
| 39 | |
| 40 .Notes | |
| 41 On Windows, it may be required to enable this Activate.ps1 script by setting the | |
| 42 execution policy for the user. You can do this by issuing the following PowerShell | |
| 43 command: | |
| 44 | |
| 45 PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser | |
| 46 | |
| 47 For more information on Execution Policies: | |
| 48 https://go.microsoft.com/fwlink/?LinkID=135170 | |
| 49 | |
| 50 #> | |
| 51 Param( | |
| 52 [Parameter(Mandatory = $false)] | |
| 53 [String] | |
| 54 $VenvDir, | |
| 55 [Parameter(Mandatory = $false)] | |
| 56 [String] | |
| 57 $Prompt | |
| 58 ) | |
| 59 | |
| 60 <# Function declarations --------------------------------------------------- #> | |
| 61 | |
| 62 <# | |
| 63 .Synopsis | |
| 64 Remove all shell session elements added by the Activate script, including the | |
| 65 addition of the virtual environment's Python executable from the beginning of | |
| 66 the PATH variable. | |
| 67 | |
| 68 .Parameter NonDestructive | |
| 69 If present, do not remove this function from the global namespace for the | |
| 70 session. | |
| 71 | |
| 72 #> | |
| 73 function global:deactivate ([switch]$NonDestructive) { | |
| 74 # Revert to original values | |
| 75 | |
| 76 # The prior prompt: | |
| 77 if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { | |
| 78 Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt | |
| 79 Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT | |
| 80 } | |
| 81 | |
| 82 # The prior PYTHONHOME: | |
| 83 if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { | |
| 84 Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME | |
| 85 Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME | |
| 86 } | |
| 87 | |
| 88 # The prior PATH: | |
| 89 if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { | |
| 90 Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH | |
| 91 Remove-Item -Path Env:_OLD_VIRTUAL_PATH | |
| 92 } | |
| 93 | |
| 94 # Just remove the VIRTUAL_ENV altogether: | |
| 95 if (Test-Path -Path Env:VIRTUAL_ENV) { | |
| 96 Remove-Item -Path env:VIRTUAL_ENV | |
| 97 } | |
| 98 | |
| 99 # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: | |
| 100 if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { | |
| 101 Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force | |
| 102 } | |
| 103 | |
| 104 # Leave deactivate function in the global namespace if requested: | |
| 105 if (-not $NonDestructive) { | |
| 106 Remove-Item -Path function:deactivate | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 <# | |
| 111 .Description | |
| 112 Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the | |
| 113 given folder, and returns them in a map. | |
| 114 | |
| 115 For each line in the pyvenv.cfg file, if that line can be parsed into exactly | |
| 116 two strings separated by `=` (with any amount of whitespace surrounding the =) | |
| 117 then it is considered a `key = value` line. The left hand string is the key, | |
| 118 the right hand is the value. | |
| 119 | |
| 120 If the value starts with a `'` or a `"` then the first and last character is | |
| 121 stripped from the value before being captured. | |
| 122 | |
| 123 .Parameter ConfigDir | |
| 124 Path to the directory that contains the `pyvenv.cfg` file. | |
| 125 #> | |
| 126 function Get-PyVenvConfig( | |
| 127 [String] | |
| 128 $ConfigDir | |
| 129 ) { | |
| 130 Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" | |
| 131 | |
| 132 # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). | |
| 133 $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue | |
| 134 | |
| 135 # An empty map will be returned if no config file is found. | |
| 136 $pyvenvConfig = @{ } | |
| 137 | |
| 138 if ($pyvenvConfigPath) { | |
| 139 | |
| 140 Write-Verbose "File exists, parse `key = value` lines" | |
| 141 $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath | |
| 142 | |
| 143 $pyvenvConfigContent | ForEach-Object { | |
| 144 $keyval = $PSItem -split "\s*=\s*", 2 | |
| 145 if ($keyval[0] -and $keyval[1]) { | |
| 146 $val = $keyval[1] | |
| 147 | |
| 148 # Remove extraneous quotations around a string value. | |
| 149 if ("'""".Contains($val.Substring(0, 1))) { | |
| 150 $val = $val.Substring(1, $val.Length - 2) | |
| 151 } | |
| 152 | |
| 153 $pyvenvConfig[$keyval[0]] = $val | |
| 154 Write-Verbose "Adding Key: '$($keyval[0])'='$val'" | |
| 155 } | |
| 156 } | |
| 157 } | |
| 158 return $pyvenvConfig | |
| 159 } | |
| 160 | |
| 161 | |
| 162 <# Begin Activate script --------------------------------------------------- #> | |
| 163 | |
| 164 # Determine the containing directory of this script | |
| 165 $VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition | |
| 166 $VenvExecDir = Get-Item -Path $VenvExecPath | |
| 167 | |
| 168 Write-Verbose "Activation script is located in path: '$VenvExecPath'" | |
| 169 Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" | |
| 170 Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" | |
| 171 | |
| 172 # Set values required in priority: CmdLine, ConfigFile, Default | |
| 173 # First, get the location of the virtual environment, it might not be | |
| 174 # VenvExecDir if specified on the command line. | |
| 175 if ($VenvDir) { | |
| 176 Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" | |
| 177 } | |
| 178 else { | |
| 179 Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." | |
| 180 $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") | |
| 181 Write-Verbose "VenvDir=$VenvDir" | |
| 182 } | |
| 183 | |
| 184 # Next, read the `pyvenv.cfg` file to determine any required value such | |
| 185 # as `prompt`. | |
| 186 $pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir | |
| 187 | |
| 188 # Next, set the prompt from the command line, or the config file, or | |
| 189 # just use the name of the virtual environment folder. | |
| 190 if ($Prompt) { | |
| 191 Write-Verbose "Prompt specified as argument, using '$Prompt'" | |
| 192 } | |
| 193 else { | |
| 194 Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" | |
| 195 if ($pyvenvCfg -and $pyvenvCfg['prompt']) { | |
| 196 Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" | |
| 197 $Prompt = $pyvenvCfg['prompt']; | |
| 198 } | |
| 199 else { | |
| 200 Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" | |
| 201 Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" | |
| 202 $Prompt = Split-Path -Path $venvDir -Leaf | |
| 203 } | |
| 204 } | |
| 205 | |
| 206 Write-Verbose "Prompt = '$Prompt'" | |
| 207 Write-Verbose "VenvDir='$VenvDir'" | |
| 208 | |
| 209 # Deactivate any currently active virtual environment, but leave the | |
| 210 # deactivate function in place. | |
| 211 deactivate -nondestructive | |
| 212 | |
| 213 # Now set the environment variable VIRTUAL_ENV, used by many tools to determine | |
| 214 # that there is an activated venv. | |
| 215 $env:VIRTUAL_ENV = $VenvDir | |
| 216 | |
| 217 if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { | |
| 218 | |
| 219 Write-Verbose "Setting prompt to '$Prompt'" | |
| 220 | |
| 221 # Set the prompt to include the env name | |
| 222 # Make sure _OLD_VIRTUAL_PROMPT is global | |
| 223 function global:_OLD_VIRTUAL_PROMPT { "" } | |
| 224 Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT | |
| 225 New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt | |
| 226 | |
| 227 function global:prompt { | |
| 228 Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " | |
| 229 _OLD_VIRTUAL_PROMPT | |
| 230 } | |
| 231 } | |
| 232 | |
| 233 # Clear PYTHONHOME | |
| 234 if (Test-Path -Path Env:PYTHONHOME) { | |
| 235 Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME | |
| 236 Remove-Item -Path Env:PYTHONHOME | |
| 237 } | |
| 238 | |
| 239 # Add the venv to the PATH | |
| 240 Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH | |
| 241 $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" |
