start
This commit is contained in:
parent
2ab80ee95d
commit
c4b12cdc3d
502
aimenv/Scripts/Activate.ps1
Normal file
502
aimenv/Scripts/Activate.ps1
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
<#
|
||||||
|
.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 declarations --------------------------------------------------- #>
|
||||||
|
|
||||||
|
<#
|
||||||
|
.Synopsis
|
||||||
|
Remove all shell session elements added by the Activate script, including the
|
||||||
|
addition of the virtual environment's Python executable from the beginning of
|
||||||
|
the PATH variable.
|
||||||
|
|
||||||
|
.Parameter NonDestructive
|
||||||
|
If present, do not remove this function from the global namespace for the
|
||||||
|
session.
|
||||||
|
|
||||||
|
#>
|
||||||
|
function global:deactivate ([switch]$NonDestructive) {
|
||||||
|
# Revert to original values
|
||||||
|
|
||||||
|
# The prior prompt:
|
||||||
|
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
||||||
|
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
||||||
|
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
||||||
|
}
|
||||||
|
|
||||||
|
# The prior PYTHONHOME:
|
||||||
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
||||||
|
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
||||||
|
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
||||||
|
}
|
||||||
|
|
||||||
|
# The prior PATH:
|
||||||
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
||||||
|
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
||||||
|
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just remove the VIRTUAL_ENV altogether:
|
||||||
|
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
||||||
|
Remove-Item -Path env:VIRTUAL_ENV
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just remove VIRTUAL_ENV_PROMPT altogether.
|
||||||
|
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
||||||
|
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
||||||
|
}
|
||||||
|
|
||||||
|
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
||||||
|
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
||||||
|
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
# Leave deactivate function in the global namespace if requested:
|
||||||
|
if (-not $NonDestructive) {
|
||||||
|
Remove-Item -Path function:deactivate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
.Description
|
||||||
|
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
||||||
|
given folder, and returns them in a map.
|
||||||
|
|
||||||
|
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
||||||
|
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
||||||
|
then it is considered a `key = value` line. The left hand string is the key,
|
||||||
|
the right hand is the value.
|
||||||
|
|
||||||
|
If the value starts with a `'` or a `"` then the first and last character is
|
||||||
|
stripped from the value before being captured.
|
||||||
|
|
||||||
|
.Parameter ConfigDir
|
||||||
|
Path to the directory that contains the `pyvenv.cfg` file.
|
||||||
|
#>
|
||||||
|
function Get-PyVenvConfig(
|
||||||
|
[String]
|
||||||
|
$ConfigDir
|
||||||
|
) {
|
||||||
|
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
||||||
|
|
||||||
|
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
||||||
|
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
||||||
|
|
||||||
|
# An empty map will be returned if no config file is found.
|
||||||
|
$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]
|
||||||
|
|
||||||
|
# Remove extraneous quotations around a string value.
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
<# Begin Activate script --------------------------------------------------- #>
|
||||||
|
|
||||||
|
# Determine the containing directory of this script
|
||||||
|
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||||
|
$VenvExecDir = Get-Item -Path $VenvExecPath
|
||||||
|
|
||||||
|
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
||||||
|
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
||||||
|
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
||||||
|
|
||||||
|
# Set values required in priority: CmdLine, ConfigFile, Default
|
||||||
|
# First, get the location of the virtual environment, it might not be
|
||||||
|
# VenvExecDir if specified on the command line.
|
||||||
|
if ($VenvDir) {
|
||||||
|
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
||||||
|
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
||||||
|
Write-Verbose "VenvDir=$VenvDir"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Next, read the `pyvenv.cfg` file to determine any required value such
|
||||||
|
# as `prompt`.
|
||||||
|
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
||||||
|
|
||||||
|
# Next, set the prompt from the command line, or the config file, or
|
||||||
|
# just use the name of the virtual environment folder.
|
||||||
|
if ($Prompt) {
|
||||||
|
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
||||||
|
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
||||||
|
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
||||||
|
$Prompt = $pyvenvCfg['prompt'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
||||||
|
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
||||||
|
$Prompt = Split-Path -Path $venvDir -Leaf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "Prompt = '$Prompt'"
|
||||||
|
Write-Verbose "VenvDir='$VenvDir'"
|
||||||
|
|
||||||
|
# Deactivate any currently active virtual environment, but leave the
|
||||||
|
# deactivate function in place.
|
||||||
|
deactivate -nondestructive
|
||||||
|
|
||||||
|
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
||||||
|
# that there is an activated venv.
|
||||||
|
$env:VIRTUAL_ENV = $VenvDir
|
||||||
|
|
||||||
|
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
||||||
|
|
||||||
|
Write-Verbose "Setting prompt to '$Prompt'"
|
||||||
|
|
||||||
|
# Set the prompt to include the env name
|
||||||
|
# Make sure _OLD_VIRTUAL_PROMPT is global
|
||||||
|
function global:_OLD_VIRTUAL_PROMPT { "" }
|
||||||
|
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_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
|
||||||
|
}
|
||||||
|
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clear PYTHONHOME
|
||||||
|
if (Test-Path -Path Env:PYTHONHOME) {
|
||||||
|
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
||||||
|
Remove-Item -Path Env:PYTHONHOME
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the venv to the PATH
|
||||||
|
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
||||||
|
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
||||||
|
|
||||||
|
# SIG # Begin signature block
|
||||||
|
# MIIvIwYJKoZIhvcNAQcCoIIvFDCCLxACAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk
|
||||||
|
# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCE8MwggWQMIIDeKADAgECAhAFmxtXno4h
|
||||||
|
# MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||||||
|
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
|
||||||
|
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z
|
||||||
|
# ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
|
||||||
|
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
|
||||||
|
# IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
|
||||||
|
# AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z
|
||||||
|
# G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ
|
||||||
|
# anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s
|
||||||
|
# Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL
|
||||||
|
# 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb
|
||||||
|
# BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3
|
||||||
|
# JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c
|
||||||
|
# AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx
|
||||||
|
# YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0
|
||||||
|
# viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL
|
||||||
|
# T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud
|
||||||
|
# EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf
|
||||||
|
# Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk
|
||||||
|
# aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS
|
||||||
|
# PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK
|
||||||
|
# 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB
|
||||||
|
# cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp
|
||||||
|
# 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg
|
||||||
|
# dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri
|
||||||
|
# RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7
|
||||||
|
# 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5
|
||||||
|
# nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3
|
||||||
|
# i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H
|
||||||
|
# EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G
|
||||||
|
# CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
|
||||||
|
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
|
||||||
|
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla
|
||||||
|
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
|
||||||
|
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
|
||||||
|
# ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C
|
||||||
|
# 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce
|
||||||
|
# 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da
|
||||||
|
# E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T
|
||||||
|
# SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA
|
||||||
|
# FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh
|
||||||
|
# D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM
|
||||||
|
# 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z
|
||||||
|
# 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05
|
||||||
|
# huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY
|
||||||
|
# mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP
|
||||||
|
# /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T
|
||||||
|
# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD
|
||||||
|
# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
|
||||||
|
# A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
|
||||||
|
# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
|
||||||
|
# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
|
||||||
|
# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
|
||||||
|
# cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN
|
||||||
|
# BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry
|
||||||
|
# sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL
|
||||||
|
# IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf
|
||||||
|
# Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh
|
||||||
|
# OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh
|
||||||
|
# dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV
|
||||||
|
# 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j
|
||||||
|
# wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH
|
||||||
|
# Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC
|
||||||
|
# XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l
|
||||||
|
# /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW
|
||||||
|
# eE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0GCSqGSIb3DQEBCwUA
|
||||||
|
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
|
||||||
|
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
|
||||||
|
# ODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1MjM1OTU5WjB8MQsw
|
||||||
|
# CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x
|
||||||
|
# IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQDExpQ
|
||||||
|
# eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
||||||
|
# ADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiSYgDFfwhjQy89koM7
|
||||||
|
# uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi0GGAZUegEAeRlSXx
|
||||||
|
# xhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN16yS8skFa3IHyvWdb
|
||||||
|
# D9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGuppxcia6a7xCyKoOA
|
||||||
|
# GjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu352diDY+iCMpk9Zanm
|
||||||
|
# SjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0ZFYKeb6BLA66d2GA
|
||||||
|
# LwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oERzTzEiV6nCO1M3U1
|
||||||
|
# HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZI7IWe7JKhHohqKuc
|
||||||
|
# eQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16xot2KVPdfyPAWd81w
|
||||||
|
# tZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapPUnwo8ygflJJ74J+B
|
||||||
|
# Yxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3ZIly+qIqDAgMBAAGj
|
||||||
|
# ggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4E
|
||||||
|
# FgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM
|
||||||
|
# MAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRp
|
||||||
|
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI
|
||||||
|
# QTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20v
|
||||||
|
# RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex
|
||||||
|
# LmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v
|
||||||
|
# d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUF
|
||||||
|
# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6
|
||||||
|
# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
|
||||||
|
# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZI
|
||||||
|
# hvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcWTiNc2rskrNLrfH1N
|
||||||
|
# s0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+VVzxC88pOEvz68nA
|
||||||
|
# 82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfLIJQsAHBla0i7QRF2
|
||||||
|
# de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izWOXM95BSkFSKdE45O
|
||||||
|
# q3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86WmjRUqbrnvdyR2yd
|
||||||
|
# I5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+W1scCpnA8YTs2d50
|
||||||
|
# jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM58WEDkbeoriDk3hxU
|
||||||
|
# 8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMfZOm5cuclMnUHs2uq
|
||||||
|
# rRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw/TKqVL4Oaz3bkMSs
|
||||||
|
# M46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3r7bjyHTxOgqxRCVa
|
||||||
|
# 18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VHxaZg2unjHY3rMYIa
|
||||||
|
# tjCCGrICAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
|
||||||
|
# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT
|
||||||
|
# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM0NHdMA0GCWCGSAFl
|
||||||
|
# AwQCAQUAoIHIMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
|
||||||
|
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBnAZ6P7YvTwq0fbF62
|
||||||
|
# o7E75R0LxsW5OtyYiFESQckLhjBcBgorBgEEAYI3AgEMMU4wTKBGgEQAQgB1AGkA
|
||||||
|
# bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAyAC4ANQBfADIAMAAyADQA
|
||||||
|
# MAA4ADAANgAuADAAMaECgAAwDQYJKoZIhvcNAQEBBQAEggIAoXbLeBCFQhwr4rTK
|
||||||
|
# R0WSySG7AtpuY1n5vhwkJPE0JgQ11PFJYphroU2ouWWM8ifejqa6m21JEWGjC9En
|
||||||
|
# Rpzpe1+eps7ClsdO+y5NxZc/3vD1j7IddJdzZh77QqDFMqJEeDNY+00OxxnnhbN1
|
||||||
|
# wJk29w8qRyIJ7HpCM0E5b8R8Atooip5ihAgrdrIsyyA3Mnl5Y+YMdqtQYe4QtOhE
|
||||||
|
# QcEoxAMoI5nLSGsbLhEM8CArl36EmX31eHTVMRJMaM98p0DkURHL030ALmW2V70h
|
||||||
|
# M7ovmhOezFyndR1d3HtcfwRB3nr5vHWZe6ythZ3wVgpsN++RdDOvHjb9LC9lkth/
|
||||||
|
# BGbcmVqsA9ZHnub1iPt89GsQBSiXjaOnWUxgJi0Qd3s2pwswLxHp05QDUE/d8EF7
|
||||||
|
# Wy6aNPI43+G2BjPLVeM3iVbMWd/yxhH6pddaVPAMKVvxJoJ7PfDLihMNyonHt0on
|
||||||
|
# xuaM5r2KaVMWpHIkgLiB9tyvdIQb0IW+YU05VAnOqh7CDaEtP7jM6P0usxY9ufEC
|
||||||
|
# BFZnOGb3M/c4KbcOuHOIkY3jGqw+DLZFrcWiIe2wbi2TsXDixs+pz8vm/KQczrQ2
|
||||||
|
# RJ1R8jrbK7IIRyZmTYf+dStZG3NhNQn1xcPYraHKNOm9CzNmeXJTdfAe0BEApqUN
|
||||||
|
# 9AiLj6uvSEp278ysr/EE3ayw2Qmhghc/MIIXOwYKKwYBBAGCNwMDATGCFyswghcn
|
||||||
|
# BgkqhkiG9w0BBwKgghcYMIIXFAIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqGSIb3
|
||||||
|
# DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgpuSq
|
||||||
|
# fyINa45wSs5Sa6msoQk+zCLDcSK24OqaBM/0/2cCEFtb0VJATq3jxU9l7ewmqjcY
|
||||||
|
# DzIwMjQwODA2MjEwMDM5WqCCEwkwggbCMIIEqqADAgECAhAFRK/zlJ0IOaa/2z9f
|
||||||
|
# 5WEWMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp
|
||||||
|
# Q2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2
|
||||||
|
# IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjMwNzE0MDAwMDAwWhcNMzQxMDEz
|
||||||
|
# MjM1OTU5WjBIMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4x
|
||||||
|
# IDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFtcCAyMDIzMIICIjANBgkqhkiG9w0B
|
||||||
|
# AQEFAAOCAg8AMIICCgKCAgEAo1NFhx2DjlusPlSzI+DPn9fl0uddoQ4J3C9Io5d6
|
||||||
|
# OyqcZ9xiFVjBqZMRp82qsmrdECmKHmJjadNYnDVxvzqX65RQjxwg6seaOy+WZuNp
|
||||||
|
# 52n+W8PWKyAcwZeUtKVQgfLPywemMGjKg0La/H8JJJSkghraarrYO8pd3hkYhftF
|
||||||
|
# 6g1hbJ3+cV7EBpo88MUueQ8bZlLjyNY+X9pD04T10Mf2SC1eRXWWdf7dEKEbg8G4
|
||||||
|
# 5lKVtUfXeCk5a+B4WZfjRCtK1ZXO7wgX6oJkTf8j48qG7rSkIWRw69XloNpjsy7p
|
||||||
|
# Be6q9iT1HbybHLK3X9/w7nZ9MZllR1WdSiQvrCuXvp/k/XtzPjLuUjT71Lvr1KAs
|
||||||
|
# NJvj3m5kGQc3AZEPHLVRzapMZoOIaGK7vEEbeBlt5NkP4FhB+9ixLOFRr7StFQYU
|
||||||
|
# 6mIIE9NpHnxkTZ0P387RXoyqq1AVybPKvNfEO2hEo6U7Qv1zfe7dCv95NBB+plwK
|
||||||
|
# WEwAPoVpdceDZNZ1zY8SdlalJPrXxGshuugfNJgvOuprAbD3+yqG7HtSOKmYCaFx
|
||||||
|
# smxxrz64b5bV4RAT/mFHCoz+8LbH1cfebCTwv0KCyqBxPZySkwS0aXAnDU+3tTbR
|
||||||
|
# yV8IpHCj7ArxES5k4MsiK8rxKBMhSVF+BmbTO77665E42FEHypS34lCh8zrTioPL
|
||||||
|
# QHsCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYG
|
||||||
|
# A1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCG
|
||||||
|
# SAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4E
|
||||||
|
# FgQUpbbvE+fvzdBkodVWqWUxo97V40kwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov
|
||||||
|
# L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1
|
||||||
|
# NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUH
|
||||||
|
# MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDov
|
||||||
|
# L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNI
|
||||||
|
# QTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAgRrW3qCp
|
||||||
|
# tZgXvHCNT4o8aJzYJf/LLOTN6l0ikuyMIgKpuM+AqNnn48XtJoKKcS8Y3U623mzX
|
||||||
|
# 4WCcK+3tPUiOuGu6fF29wmE3aEl3o+uQqhLXJ4Xzjh6S2sJAOJ9dyKAuJXglnSoF
|
||||||
|
# eoQpmLZXeY/bJlYrsPOnvTcM2Jh2T1a5UsK2nTipgedtQVyMadG5K8TGe8+c+nji
|
||||||
|
# kxp2oml101DkRBK+IA2eqUTQ+OVJdwhaIcW0z5iVGlS6ubzBaRm6zxbygzc0brBB
|
||||||
|
# Jt3eWpdPM43UjXd9dUWhpVgmagNF3tlQtVCMr1a9TMXhRsUo063nQwBw3syYnhmJ
|
||||||
|
# A+rUkTfvTVLzyWAhxFZH7doRS4wyw4jmWOK22z75X7BC1o/jF5HRqsBV44a/rCcs
|
||||||
|
# QdCaM0qoNtS5cpZ+l3k4SF/Kwtw9Mt911jZnWon49qfH5U81PAC9vpwqbHkB3NpE
|
||||||
|
# 5jreODsHXjlY9HxzMVWggBHLFAx+rrz+pOt5Zapo1iLKO+uagjVXKBbLafIymrLS
|
||||||
|
# 2Dq4sUaGa7oX/cR3bBVsrquvczroSUa31X/MtjjA2Owc9bahuEMs305MfR5ocMB3
|
||||||
|
# CtQC4Fxguyj/OOVSWtasFyIjTvTs0xf7UGv/B3cfcZdEQcm4RtNsMnxYL2dHZeUb
|
||||||
|
# c7aZ+WssBkbvQR7w8F/g29mtkIBEr4AQQYowggauMIIElqADAgECAhAHNje3JFR8
|
||||||
|
# 2Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||||||
|
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
|
||||||
|
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0z
|
||||||
|
# NzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
|
||||||
|
# SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1
|
||||||
|
# NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
||||||
|
# AQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI
|
||||||
|
# 82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9
|
||||||
|
# xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ
|
||||||
|
# 3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5Emfv
|
||||||
|
# DqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDET
|
||||||
|
# qVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHe
|
||||||
|
# IhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jo
|
||||||
|
# n7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ
|
||||||
|
# 9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/T
|
||||||
|
# Xkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJg
|
||||||
|
# o1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkw
|
||||||
|
# EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+e
|
||||||
|
# yG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQD
|
||||||
|
# AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEF
|
||||||
|
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRw
|
||||||
|
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
|
||||||
|
# dDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln
|
||||||
|
# aUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglg
|
||||||
|
# hkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGw
|
||||||
|
# GC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0
|
||||||
|
# MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1D
|
||||||
|
# X+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw
|
||||||
|
# 1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY
|
||||||
|
# +/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0I
|
||||||
|
# SQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr
|
||||||
|
# 5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7y
|
||||||
|
# Rp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDop
|
||||||
|
# hrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/
|
||||||
|
# AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMO
|
||||||
|
# Hds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkq
|
||||||
|
# hkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
|
||||||
|
# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB
|
||||||
|
# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5
|
||||||
|
# WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
||||||
|
# ExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJv
|
||||||
|
# b3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1K
|
||||||
|
# PDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2r
|
||||||
|
# snnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C
|
||||||
|
# 8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBf
|
||||||
|
# sXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
|
||||||
|
# QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8
|
||||||
|
# rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaY
|
||||||
|
# dj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+
|
||||||
|
# wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw
|
||||||
|
# ++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+N
|
||||||
|
# P8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7F
|
||||||
|
# wI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUw
|
||||||
|
# AwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAU
|
||||||
|
# Reuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEB
|
||||||
|
# BG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsG
|
||||||
|
# AQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
|
||||||
|
# cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRp
|
||||||
|
# Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAow
|
||||||
|
# CDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/
|
||||||
|
# Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLe
|
||||||
|
# JLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE
|
||||||
|
# 1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9Hda
|
||||||
|
# XFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbO
|
||||||
|
# byMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYID
|
||||||
|
# djCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
|
||||||
|
# Yy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYg
|
||||||
|
# VGltZVN0YW1waW5nIENBAhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUA
|
||||||
|
# oIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcN
|
||||||
|
# MjQwODA2MjEwMDM5WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBRm8CsywsLJD4Jd
|
||||||
|
# zqqKycZPGZzPQDAvBgkqhkiG9w0BCQQxIgQglCIBxGudJQwqEBh+XAoT3nqSoAuS
|
||||||
|
# uMjmJTX95zFjdk0wNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQg0vbkbe10IszR1EBX
|
||||||
|
# aEE2b4KK2lWarjMWr00amtQMeCgwDQYJKoZIhvcNAQEBBQAEggIAOkILAZviyFOU
|
||||||
|
# Qzt10RYNFHl0zO4rgXcR5oCeJlU1n9y+DwjCTvcrax9qdkEuiEJWDewXbak3TPQK
|
||||||
|
# 0ts7jhUIFMDTEn8GZXysruzDlYNLstKM4RbYIK+f2772phehvABS5mn70+L63GXe
|
||||||
|
# A5UFYM5M7BAvEY+3DKEwUnN9lAl8YKi1xS545MXYm1B96gI/7oEBDkNV2DoNIZAw
|
||||||
|
# R2B4wPTcpI2aG5zZ0jFgVtq8bOXLZ9b9pBrhKbf4PZWxPqAFwUtZryQKdt770u3Y
|
||||||
|
# l0WR2SgemKq4aOEvajD1J4fC56lnUoekXt4yH8/fBueCXYx+ADoEkU4/ota7C1oL
|
||||||
|
# aCZE4G0iQOH9XFtMUjA87oEPisJG63onir6tsurTjjm/wK8VnFQBSii4ILtfSOfR
|
||||||
|
# kDMsu7kS0H5SWliY3sPlDTn4Kwl14EThMmyXUr7SFFHnsibHtfLATTmV6XyeJ03l
|
||||||
|
# BmwDl8hdzt5G0pjH/u3bTFcdJu7J0RQuGYgpmNsVYjHCQnZDrJjzIE2os/QYgL6D
|
||||||
|
# B/ZYSv96jnYs6cFd93R0ixZMsQPQKcs2gbVYz3nymJL7t605LzW86tENmORsUdgm
|
||||||
|
# qh0ky+qe/+D/f88WLLjdHi/xfskiFKEL66Y4EWkECoUUMBRcJlIg1GszTCVmwD1N
|
||||||
|
# foIJo8CaFGMoR+QHwDeamNbOOlrCFMQ=
|
||||||
|
# SIG # End signature block
|
70
aimenv/Scripts/activate
Normal file
70
aimenv/Scripts/activate
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# This file must be used with "source bin/activate" *from bash*
|
||||||
|
# You cannot run it directly
|
||||||
|
|
||||||
|
deactivate () {
|
||||||
|
# reset old environment variables
|
||||||
|
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
||||||
|
PATH="${_OLD_VIRTUAL_PATH:-}"
|
||||||
|
export PATH
|
||||||
|
unset _OLD_VIRTUAL_PATH
|
||||||
|
fi
|
||||||
|
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
||||||
|
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
||||||
|
export PYTHONHOME
|
||||||
|
unset _OLD_VIRTUAL_PYTHONHOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Call hash to forget past commands. Without forgetting
|
||||||
|
# past commands the $PATH changes we made may not be respected
|
||||||
|
hash -r 2> /dev/null
|
||||||
|
|
||||||
|
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
||||||
|
PS1="${_OLD_VIRTUAL_PS1:-}"
|
||||||
|
export PS1
|
||||||
|
unset _OLD_VIRTUAL_PS1
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset VIRTUAL_ENV
|
||||||
|
unset VIRTUAL_ENV_PROMPT
|
||||||
|
if [ ! "${1:-}" = "nondestructive" ] ; then
|
||||||
|
# Self destruct!
|
||||||
|
unset -f deactivate
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# unset irrelevant variables
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
# on Windows, a path can contain colons and backslashes and has to be converted:
|
||||||
|
if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
|
||||||
|
# transform D:\path\to\venv to /d/path/to/venv on MSYS
|
||||||
|
# and to /cygdrive/d/path/to/venv on Cygwin
|
||||||
|
export VIRTUAL_ENV=$(cygpath "C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv")
|
||||||
|
else
|
||||||
|
# use the path as-is
|
||||||
|
export VIRTUAL_ENV="C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv"
|
||||||
|
fi
|
||||||
|
|
||||||
|
_OLD_VIRTUAL_PATH="$PATH"
|
||||||
|
PATH="$VIRTUAL_ENV/Scripts:$PATH"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# unset PYTHONHOME if set
|
||||||
|
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
||||||
|
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
||||||
|
if [ -n "${PYTHONHOME:-}" ] ; then
|
||||||
|
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
||||||
|
unset PYTHONHOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
||||||
|
_OLD_VIRTUAL_PS1="${PS1:-}"
|
||||||
|
PS1="(aimenv) ${PS1:-}"
|
||||||
|
export PS1
|
||||||
|
VIRTUAL_ENV_PROMPT="(aimenv) "
|
||||||
|
export VIRTUAL_ENV_PROMPT
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Call hash to forget past commands. Without forgetting
|
||||||
|
# past commands the $PATH changes we made may not be respected
|
||||||
|
hash -r 2> /dev/null
|
34
aimenv/Scripts/activate.bat
Normal file
34
aimenv/Scripts/activate.bat
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
rem This file is UTF-8 encoded, so we need to update the current code page while executing it
|
||||||
|
for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
|
||||||
|
set _OLD_CODEPAGE=%%a
|
||||||
|
)
|
||||||
|
if defined _OLD_CODEPAGE (
|
||||||
|
"%SystemRoot%\System32\chcp.com" 65001 > nul
|
||||||
|
)
|
||||||
|
|
||||||
|
set VIRTUAL_ENV=C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv
|
||||||
|
|
||||||
|
if not defined PROMPT set PROMPT=$P$G
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||||
|
if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PROMPT=%PROMPT%
|
||||||
|
set PROMPT=(aimenv) %PROMPT%
|
||||||
|
|
||||||
|
if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
|
||||||
|
set PYTHONHOME=
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
|
||||||
|
if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
|
||||||
|
|
||||||
|
set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
|
||||||
|
set VIRTUAL_ENV_PROMPT=(aimenv)
|
||||||
|
|
||||||
|
:END
|
||||||
|
if defined _OLD_CODEPAGE (
|
||||||
|
"%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
|
||||||
|
set _OLD_CODEPAGE=
|
||||||
|
)
|
22
aimenv/Scripts/deactivate.bat
Normal file
22
aimenv/Scripts/deactivate.bat
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PROMPT (
|
||||||
|
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
|
||||||
|
)
|
||||||
|
set _OLD_VIRTUAL_PROMPT=
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||||
|
set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
|
||||||
|
set _OLD_VIRTUAL_PYTHONHOME=
|
||||||
|
)
|
||||||
|
|
||||||
|
if defined _OLD_VIRTUAL_PATH (
|
||||||
|
set "PATH=%_OLD_VIRTUAL_PATH%"
|
||||||
|
)
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PATH=
|
||||||
|
|
||||||
|
set VIRTUAL_ENV=
|
||||||
|
set VIRTUAL_ENV_PROMPT=
|
||||||
|
|
||||||
|
:END
|
BIN
aimenv/Scripts/debugpy.exe
Normal file
BIN
aimenv/Scripts/debugpy.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/ipython.exe
Normal file
BIN
aimenv/Scripts/ipython.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/ipython3.exe
Normal file
BIN
aimenv/Scripts/ipython3.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter-kernel.exe
Normal file
BIN
aimenv/Scripts/jupyter-kernel.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter-kernelspec.exe
Normal file
BIN
aimenv/Scripts/jupyter-kernelspec.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter-migrate.exe
Normal file
BIN
aimenv/Scripts/jupyter-migrate.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter-run.exe
Normal file
BIN
aimenv/Scripts/jupyter-run.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter-troubleshoot.exe
Normal file
BIN
aimenv/Scripts/jupyter-troubleshoot.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/jupyter.exe
Normal file
BIN
aimenv/Scripts/jupyter.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/pip.exe
Normal file
BIN
aimenv/Scripts/pip.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/pip3.12.exe
Normal file
BIN
aimenv/Scripts/pip3.12.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/pip3.exe
Normal file
BIN
aimenv/Scripts/pip3.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/pygmentize.exe
Normal file
BIN
aimenv/Scripts/pygmentize.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/python.exe
Normal file
BIN
aimenv/Scripts/python.exe
Normal file
Binary file not shown.
BIN
aimenv/Scripts/pythonw.exe
Normal file
BIN
aimenv/Scripts/pythonw.exe
Normal file
Binary file not shown.
783
aimenv/Scripts/pywin32_postinstall.py
Normal file
783
aimenv/Scripts/pywin32_postinstall.py
Normal file
@ -0,0 +1,783 @@
|
|||||||
|
# postinstall script for pywin32
|
||||||
|
#
|
||||||
|
# copies PyWinTypesxx.dll and PythonCOMxx.dll into the system directory,
|
||||||
|
# and creates a pth file
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import sysconfig
|
||||||
|
|
||||||
|
try:
|
||||||
|
import winreg as winreg
|
||||||
|
except:
|
||||||
|
import winreg
|
||||||
|
|
||||||
|
# Send output somewhere so it can be found if necessary...
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
tee_f = open(os.path.join(tempfile.gettempdir(), "pywin32_postinstall.log"), "w")
|
||||||
|
|
||||||
|
|
||||||
|
class Tee:
|
||||||
|
def __init__(self, file):
|
||||||
|
self.f = file
|
||||||
|
|
||||||
|
def write(self, what):
|
||||||
|
if self.f is not None:
|
||||||
|
try:
|
||||||
|
self.f.write(what.replace("\n", "\r\n"))
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
tee_f.write(what)
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
if self.f is not None:
|
||||||
|
try:
|
||||||
|
self.f.flush()
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
tee_f.flush()
|
||||||
|
|
||||||
|
|
||||||
|
# For some unknown reason, when running under bdist_wininst we will start up
|
||||||
|
# with sys.stdout as None but stderr is hooked up. This work-around allows
|
||||||
|
# bdist_wininst to see the output we write and display it at the end of
|
||||||
|
# the install.
|
||||||
|
if sys.stdout is None:
|
||||||
|
sys.stdout = sys.stderr
|
||||||
|
|
||||||
|
sys.stderr = Tee(sys.stderr)
|
||||||
|
sys.stdout = Tee(sys.stdout)
|
||||||
|
|
||||||
|
com_modules = [
|
||||||
|
# module_name, class_names
|
||||||
|
("win32com.servers.interp", "Interpreter"),
|
||||||
|
("win32com.servers.dictionary", "DictionaryPolicy"),
|
||||||
|
("win32com.axscript.client.pyscript", "PyScript"),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Is this a 'silent' install - ie, avoid all dialogs.
|
||||||
|
# Different than 'verbose'
|
||||||
|
silent = 0
|
||||||
|
|
||||||
|
# Verbosity of output messages.
|
||||||
|
verbose = 1
|
||||||
|
|
||||||
|
root_key_name = "Software\\Python\\PythonCore\\" + sys.winver
|
||||||
|
|
||||||
|
try:
|
||||||
|
# When this script is run from inside the bdist_wininst installer,
|
||||||
|
# file_created() and directory_created() are additional builtin
|
||||||
|
# functions which write lines to Python23\pywin32-install.log. This is
|
||||||
|
# a list of actions for the uninstaller, the format is inspired by what
|
||||||
|
# the Wise installer also creates.
|
||||||
|
file_created
|
||||||
|
is_bdist_wininst = True
|
||||||
|
except NameError:
|
||||||
|
is_bdist_wininst = False # we know what it is not - but not what it is :)
|
||||||
|
|
||||||
|
def file_created(file):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def directory_created(directory):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_root_hkey():
|
||||||
|
try:
|
||||||
|
winreg.OpenKey(
|
||||||
|
winreg.HKEY_LOCAL_MACHINE, root_key_name, 0, winreg.KEY_CREATE_SUB_KEY
|
||||||
|
)
|
||||||
|
return winreg.HKEY_LOCAL_MACHINE
|
||||||
|
except OSError:
|
||||||
|
# Either not exist, or no permissions to create subkey means
|
||||||
|
# must be HKCU
|
||||||
|
return winreg.HKEY_CURRENT_USER
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
create_shortcut
|
||||||
|
except NameError:
|
||||||
|
# Create a function with the same signature as create_shortcut provided
|
||||||
|
# by bdist_wininst
|
||||||
|
def create_shortcut(
|
||||||
|
path, description, filename, arguments="", workdir="", iconpath="", iconindex=0
|
||||||
|
):
|
||||||
|
import pythoncom
|
||||||
|
from win32com.shell import shell
|
||||||
|
|
||||||
|
ilink = pythoncom.CoCreateInstance(
|
||||||
|
shell.CLSID_ShellLink,
|
||||||
|
None,
|
||||||
|
pythoncom.CLSCTX_INPROC_SERVER,
|
||||||
|
shell.IID_IShellLink,
|
||||||
|
)
|
||||||
|
ilink.SetPath(path)
|
||||||
|
ilink.SetDescription(description)
|
||||||
|
if arguments:
|
||||||
|
ilink.SetArguments(arguments)
|
||||||
|
if workdir:
|
||||||
|
ilink.SetWorkingDirectory(workdir)
|
||||||
|
if iconpath or iconindex:
|
||||||
|
ilink.SetIconLocation(iconpath, iconindex)
|
||||||
|
# now save it.
|
||||||
|
ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile)
|
||||||
|
ipf.Save(filename, 0)
|
||||||
|
|
||||||
|
# Support the same list of "path names" as bdist_wininst.
|
||||||
|
def get_special_folder_path(path_name):
|
||||||
|
from win32com.shell import shell, shellcon
|
||||||
|
|
||||||
|
for maybe in """
|
||||||
|
CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA
|
||||||
|
CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY
|
||||||
|
CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP
|
||||||
|
CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON
|
||||||
|
CSIDL_PROGRAM_FILES CSIDL_FONTS""".split():
|
||||||
|
if maybe == path_name:
|
||||||
|
csidl = getattr(shellcon, maybe)
|
||||||
|
return shell.SHGetSpecialFolderPath(0, csidl, False)
|
||||||
|
raise ValueError("%s is an unknown path ID" % (path_name,))
|
||||||
|
|
||||||
|
|
||||||
|
def CopyTo(desc, src, dest):
|
||||||
|
import win32api
|
||||||
|
import win32con
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
win32api.CopyFile(src, dest, 0)
|
||||||
|
return
|
||||||
|
except win32api.error as details:
|
||||||
|
if details.winerror == 5: # access denied - user not admin.
|
||||||
|
raise
|
||||||
|
if silent:
|
||||||
|
# Running silent mode - just re-raise the error.
|
||||||
|
raise
|
||||||
|
full_desc = (
|
||||||
|
"Error %s\n\n"
|
||||||
|
"If you have any Python applications running, "
|
||||||
|
"please close them now\nand select 'Retry'\n\n%s"
|
||||||
|
% (desc, details.strerror)
|
||||||
|
)
|
||||||
|
rc = win32api.MessageBox(
|
||||||
|
0, full_desc, "Installation Error", win32con.MB_ABORTRETRYIGNORE
|
||||||
|
)
|
||||||
|
if rc == win32con.IDABORT:
|
||||||
|
raise
|
||||||
|
elif rc == win32con.IDIGNORE:
|
||||||
|
return
|
||||||
|
# else retry - around we go again.
|
||||||
|
|
||||||
|
|
||||||
|
# We need to import win32api to determine the Windows system directory,
|
||||||
|
# so we can copy our system files there - but importing win32api will
|
||||||
|
# load the pywintypes.dll already in the system directory preventing us
|
||||||
|
# from updating them!
|
||||||
|
# So, we pull the same trick pywintypes.py does, but it loads from
|
||||||
|
# our pywintypes_system32 directory.
|
||||||
|
def LoadSystemModule(lib_dir, modname):
|
||||||
|
# See if this is a debug build.
|
||||||
|
import importlib.machinery
|
||||||
|
import importlib.util
|
||||||
|
|
||||||
|
suffix = "_d" if "_d.pyd" in importlib.machinery.EXTENSION_SUFFIXES else ""
|
||||||
|
filename = "%s%d%d%s.dll" % (
|
||||||
|
modname,
|
||||||
|
sys.version_info[0],
|
||||||
|
sys.version_info[1],
|
||||||
|
suffix,
|
||||||
|
)
|
||||||
|
filename = os.path.join(lib_dir, "pywin32_system32", filename)
|
||||||
|
loader = importlib.machinery.ExtensionFileLoader(modname, filename)
|
||||||
|
spec = importlib.machinery.ModuleSpec(name=modname, loader=loader, origin=filename)
|
||||||
|
mod = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(mod)
|
||||||
|
|
||||||
|
|
||||||
|
def SetPyKeyVal(key_name, value_name, value):
|
||||||
|
root_hkey = get_root_hkey()
|
||||||
|
root_key = winreg.OpenKey(root_hkey, root_key_name)
|
||||||
|
try:
|
||||||
|
my_key = winreg.CreateKey(root_key, key_name)
|
||||||
|
try:
|
||||||
|
winreg.SetValueEx(my_key, value_name, 0, winreg.REG_SZ, value)
|
||||||
|
if verbose:
|
||||||
|
print("-> %s\\%s[%s]=%r" % (root_key_name, key_name, value_name, value))
|
||||||
|
finally:
|
||||||
|
my_key.Close()
|
||||||
|
finally:
|
||||||
|
root_key.Close()
|
||||||
|
|
||||||
|
|
||||||
|
def UnsetPyKeyVal(key_name, value_name, delete_key=False):
|
||||||
|
root_hkey = get_root_hkey()
|
||||||
|
root_key = winreg.OpenKey(root_hkey, root_key_name)
|
||||||
|
try:
|
||||||
|
my_key = winreg.OpenKey(root_key, key_name, 0, winreg.KEY_SET_VALUE)
|
||||||
|
try:
|
||||||
|
winreg.DeleteValue(my_key, value_name)
|
||||||
|
if verbose:
|
||||||
|
print("-> DELETE %s\\%s[%s]" % (root_key_name, key_name, value_name))
|
||||||
|
finally:
|
||||||
|
my_key.Close()
|
||||||
|
if delete_key:
|
||||||
|
winreg.DeleteKey(root_key, key_name)
|
||||||
|
if verbose:
|
||||||
|
print("-> DELETE %s\\%s" % (root_key_name, key_name))
|
||||||
|
except OSError as why:
|
||||||
|
winerror = getattr(why, "winerror", why.errno)
|
||||||
|
if winerror != 2: # file not found
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
root_key.Close()
|
||||||
|
|
||||||
|
|
||||||
|
def RegisterCOMObjects(register=True):
|
||||||
|
import win32com.server.register
|
||||||
|
|
||||||
|
if register:
|
||||||
|
func = win32com.server.register.RegisterClasses
|
||||||
|
else:
|
||||||
|
func = win32com.server.register.UnregisterClasses
|
||||||
|
flags = {}
|
||||||
|
if not verbose:
|
||||||
|
flags["quiet"] = 1
|
||||||
|
for module, klass_name in com_modules:
|
||||||
|
__import__(module)
|
||||||
|
mod = sys.modules[module]
|
||||||
|
flags["finalize_register"] = getattr(mod, "DllRegisterServer", None)
|
||||||
|
flags["finalize_unregister"] = getattr(mod, "DllUnregisterServer", None)
|
||||||
|
klass = getattr(mod, klass_name)
|
||||||
|
func(klass, **flags)
|
||||||
|
|
||||||
|
|
||||||
|
def RegisterHelpFile(register=True, lib_dir=None):
|
||||||
|
if lib_dir is None:
|
||||||
|
lib_dir = sysconfig.get_paths()["platlib"]
|
||||||
|
if register:
|
||||||
|
# Register the .chm help file.
|
||||||
|
chm_file = os.path.join(lib_dir, "PyWin32.chm")
|
||||||
|
if os.path.isfile(chm_file):
|
||||||
|
# This isn't recursive, so if 'Help' doesn't exist, we croak
|
||||||
|
SetPyKeyVal("Help", None, None)
|
||||||
|
SetPyKeyVal("Help\\Pythonwin Reference", None, chm_file)
|
||||||
|
return chm_file
|
||||||
|
else:
|
||||||
|
print("NOTE: PyWin32.chm can not be located, so has not " "been registered")
|
||||||
|
else:
|
||||||
|
UnsetPyKeyVal("Help\\Pythonwin Reference", None, delete_key=True)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def RegisterPythonwin(register=True, lib_dir=None):
|
||||||
|
"""Add (or remove) Pythonwin to context menu for python scripts.
|
||||||
|
??? Should probably also add Edit command for pys files also.
|
||||||
|
Also need to remove these keys on uninstall, but there's no function
|
||||||
|
like file_created to add registry entries to uninstall log ???
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
|
||||||
|
if lib_dir is None:
|
||||||
|
lib_dir = sysconfig.get_paths()["platlib"]
|
||||||
|
classes_root = get_root_hkey()
|
||||||
|
## Installer executable doesn't seem to pass anything to postinstall script indicating if it's a debug build,
|
||||||
|
pythonwin_exe = os.path.join(lib_dir, "Pythonwin", "Pythonwin.exe")
|
||||||
|
pythonwin_edit_command = pythonwin_exe + ' -edit "%1"'
|
||||||
|
|
||||||
|
keys_vals = [
|
||||||
|
(
|
||||||
|
"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Pythonwin.exe",
|
||||||
|
"",
|
||||||
|
pythonwin_exe,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Software\\Classes\\Python.File\\shell\\Edit with Pythonwin",
|
||||||
|
"command",
|
||||||
|
pythonwin_edit_command,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Software\\Classes\\Python.NoConFile\\shell\\Edit with Pythonwin",
|
||||||
|
"command",
|
||||||
|
pythonwin_edit_command,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
if register:
|
||||||
|
for key, sub_key, val in keys_vals:
|
||||||
|
## Since winreg only uses the character Api functions, this can fail if Python
|
||||||
|
## is installed to a path containing non-ascii characters
|
||||||
|
hkey = winreg.CreateKey(classes_root, key)
|
||||||
|
if sub_key:
|
||||||
|
hkey = winreg.CreateKey(hkey, sub_key)
|
||||||
|
winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, val)
|
||||||
|
hkey.Close()
|
||||||
|
else:
|
||||||
|
for key, sub_key, val in keys_vals:
|
||||||
|
try:
|
||||||
|
if sub_key:
|
||||||
|
hkey = winreg.OpenKey(classes_root, key)
|
||||||
|
winreg.DeleteKey(hkey, sub_key)
|
||||||
|
hkey.Close()
|
||||||
|
winreg.DeleteKey(classes_root, key)
|
||||||
|
except OSError as why:
|
||||||
|
winerror = getattr(why, "winerror", why.errno)
|
||||||
|
if winerror != 2: # file not found
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
# tell windows about the change
|
||||||
|
from win32com.shell import shell, shellcon
|
||||||
|
|
||||||
|
shell.SHChangeNotify(
|
||||||
|
shellcon.SHCNE_ASSOCCHANGED, shellcon.SHCNF_IDLIST, None, None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_shortcuts_folder():
|
||||||
|
if get_root_hkey() == winreg.HKEY_LOCAL_MACHINE:
|
||||||
|
try:
|
||||||
|
fldr = get_special_folder_path("CSIDL_COMMON_PROGRAMS")
|
||||||
|
except OSError:
|
||||||
|
# No CSIDL_COMMON_PROGRAMS on this platform
|
||||||
|
fldr = get_special_folder_path("CSIDL_PROGRAMS")
|
||||||
|
else:
|
||||||
|
# non-admin install - always goes in this user's start menu.
|
||||||
|
fldr = get_special_folder_path("CSIDL_PROGRAMS")
|
||||||
|
|
||||||
|
try:
|
||||||
|
install_group = winreg.QueryValue(
|
||||||
|
get_root_hkey(), root_key_name + "\\InstallPath\\InstallGroup"
|
||||||
|
)
|
||||||
|
except OSError:
|
||||||
|
vi = sys.version_info
|
||||||
|
install_group = "Python %d.%d" % (vi[0], vi[1])
|
||||||
|
return os.path.join(fldr, install_group)
|
||||||
|
|
||||||
|
|
||||||
|
# Get the system directory, which may be the Wow64 directory if we are a 32bit
|
||||||
|
# python on a 64bit OS.
|
||||||
|
def get_system_dir():
|
||||||
|
import win32api # we assume this exists.
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pythoncom
|
||||||
|
import win32process
|
||||||
|
from win32com.shell import shell, shellcon
|
||||||
|
|
||||||
|
try:
|
||||||
|
if win32process.IsWow64Process():
|
||||||
|
return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEMX86)
|
||||||
|
return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEM)
|
||||||
|
except (pythoncom.com_error, win32process.error):
|
||||||
|
return win32api.GetSystemDirectory()
|
||||||
|
except ImportError:
|
||||||
|
return win32api.GetSystemDirectory()
|
||||||
|
|
||||||
|
|
||||||
|
def fixup_dbi():
|
||||||
|
# We used to have a dbi.pyd with our .pyd files, but now have a .py file.
|
||||||
|
# If the user didn't uninstall, they will find the .pyd which will cause
|
||||||
|
# problems - so handle that.
|
||||||
|
import win32api
|
||||||
|
import win32con
|
||||||
|
|
||||||
|
pyd_name = os.path.join(os.path.dirname(win32api.__file__), "dbi.pyd")
|
||||||
|
pyd_d_name = os.path.join(os.path.dirname(win32api.__file__), "dbi_d.pyd")
|
||||||
|
py_name = os.path.join(os.path.dirname(win32con.__file__), "dbi.py")
|
||||||
|
for this_pyd in (pyd_name, pyd_d_name):
|
||||||
|
this_dest = this_pyd + ".old"
|
||||||
|
if os.path.isfile(this_pyd) and os.path.isfile(py_name):
|
||||||
|
try:
|
||||||
|
if os.path.isfile(this_dest):
|
||||||
|
print(
|
||||||
|
"Old dbi '%s' already exists - deleting '%s'"
|
||||||
|
% (this_dest, this_pyd)
|
||||||
|
)
|
||||||
|
os.remove(this_pyd)
|
||||||
|
else:
|
||||||
|
os.rename(this_pyd, this_dest)
|
||||||
|
print("renamed '%s'->'%s.old'" % (this_pyd, this_pyd))
|
||||||
|
file_created(this_pyd + ".old")
|
||||||
|
except os.error as exc:
|
||||||
|
print("FAILED to rename '%s': %s" % (this_pyd, exc))
|
||||||
|
|
||||||
|
|
||||||
|
def install(lib_dir):
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
# The .pth file is now installed as a regular file.
|
||||||
|
# Create the .pth file in the site-packages dir, and use only relative paths
|
||||||
|
# We used to write a .pth directly to sys.prefix - clobber it.
|
||||||
|
if os.path.isfile(os.path.join(sys.prefix, "pywin32.pth")):
|
||||||
|
os.unlink(os.path.join(sys.prefix, "pywin32.pth"))
|
||||||
|
# The .pth may be new and therefore not loaded in this session.
|
||||||
|
# Setup the paths just in case.
|
||||||
|
for name in "win32 win32\\lib Pythonwin".split():
|
||||||
|
sys.path.append(os.path.join(lib_dir, name))
|
||||||
|
# It is possible people with old versions installed with still have
|
||||||
|
# pywintypes and pythoncom registered. We no longer need this, and stale
|
||||||
|
# entries hurt us.
|
||||||
|
for name in "pythoncom pywintypes".split():
|
||||||
|
keyname = "Software\\Python\\PythonCore\\" + sys.winver + "\\Modules\\" + name
|
||||||
|
for root in winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER:
|
||||||
|
try:
|
||||||
|
winreg.DeleteKey(root, keyname + "\\Debug")
|
||||||
|
except WindowsError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
winreg.DeleteKey(root, keyname)
|
||||||
|
except WindowsError:
|
||||||
|
pass
|
||||||
|
LoadSystemModule(lib_dir, "pywintypes")
|
||||||
|
LoadSystemModule(lib_dir, "pythoncom")
|
||||||
|
import win32api
|
||||||
|
|
||||||
|
# and now we can get the system directory:
|
||||||
|
files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
|
||||||
|
if not files:
|
||||||
|
raise RuntimeError("No system files to copy!!")
|
||||||
|
# Try the system32 directory first - if that fails due to "access denied",
|
||||||
|
# it implies a non-admin user, and we use sys.prefix
|
||||||
|
for dest_dir in [get_system_dir(), sys.prefix]:
|
||||||
|
# and copy some files over there
|
||||||
|
worked = 0
|
||||||
|
try:
|
||||||
|
for fname in files:
|
||||||
|
base = os.path.basename(fname)
|
||||||
|
dst = os.path.join(dest_dir, base)
|
||||||
|
CopyTo("installing %s" % base, fname, dst)
|
||||||
|
if verbose:
|
||||||
|
print("Copied %s to %s" % (base, dst))
|
||||||
|
# Register the files with the uninstaller
|
||||||
|
file_created(dst)
|
||||||
|
worked = 1
|
||||||
|
# Nuke any other versions that may exist - having
|
||||||
|
# duplicates causes major headaches.
|
||||||
|
bad_dest_dirs = [
|
||||||
|
os.path.join(sys.prefix, "Library\\bin"),
|
||||||
|
os.path.join(sys.prefix, "Lib\\site-packages\\win32"),
|
||||||
|
]
|
||||||
|
if dest_dir != sys.prefix:
|
||||||
|
bad_dest_dirs.append(sys.prefix)
|
||||||
|
for bad_dest_dir in bad_dest_dirs:
|
||||||
|
bad_fname = os.path.join(bad_dest_dir, base)
|
||||||
|
if os.path.exists(bad_fname):
|
||||||
|
# let exceptions go here - delete must succeed
|
||||||
|
os.unlink(bad_fname)
|
||||||
|
if worked:
|
||||||
|
break
|
||||||
|
except win32api.error as details:
|
||||||
|
if details.winerror == 5:
|
||||||
|
# access denied - user not admin - try sys.prefix dir,
|
||||||
|
# but first check that a version doesn't already exist
|
||||||
|
# in that place - otherwise that one will still get used!
|
||||||
|
if os.path.exists(dst):
|
||||||
|
msg = (
|
||||||
|
"The file '%s' exists, but can not be replaced "
|
||||||
|
"due to insufficient permissions. You must "
|
||||||
|
"reinstall this software as an Administrator" % dst
|
||||||
|
)
|
||||||
|
print(msg)
|
||||||
|
raise RuntimeError(msg)
|
||||||
|
continue
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
raise RuntimeError(
|
||||||
|
"You don't have enough permissions to install the system files"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Pythonwin 'compiles' config files - record them for uninstall.
|
||||||
|
pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
|
||||||
|
for fname in glob.glob(os.path.join(pywin_dir, "*.cfg")):
|
||||||
|
file_created(fname[:-1] + "c") # .cfg->.cfc
|
||||||
|
|
||||||
|
# Register our demo COM objects.
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
RegisterCOMObjects()
|
||||||
|
except win32api.error as details:
|
||||||
|
if details.winerror != 5: # ERROR_ACCESS_DENIED
|
||||||
|
raise
|
||||||
|
print("You do not have the permissions to install COM objects.")
|
||||||
|
print("The sample COM objects were not registered.")
|
||||||
|
except Exception:
|
||||||
|
print("FAILED to register the Python COM objects")
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
# There may be no main Python key in HKCU if, eg, an admin installed
|
||||||
|
# python itself.
|
||||||
|
winreg.CreateKey(get_root_hkey(), root_key_name)
|
||||||
|
|
||||||
|
chm_file = None
|
||||||
|
try:
|
||||||
|
chm_file = RegisterHelpFile(True, lib_dir)
|
||||||
|
except Exception:
|
||||||
|
print("Failed to register help file")
|
||||||
|
traceback.print_exc()
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print("Registered help file")
|
||||||
|
|
||||||
|
# misc other fixups.
|
||||||
|
fixup_dbi()
|
||||||
|
|
||||||
|
# Register Pythonwin in context menu
|
||||||
|
try:
|
||||||
|
RegisterPythonwin(True, lib_dir)
|
||||||
|
except Exception:
|
||||||
|
print("Failed to register pythonwin as editor")
|
||||||
|
traceback.print_exc()
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print("Pythonwin has been registered in context menu")
|
||||||
|
|
||||||
|
# Create the win32com\gen_py directory.
|
||||||
|
make_dir = os.path.join(lib_dir, "win32com", "gen_py")
|
||||||
|
if not os.path.isdir(make_dir):
|
||||||
|
if verbose:
|
||||||
|
print("Creating directory %s" % (make_dir,))
|
||||||
|
directory_created(make_dir)
|
||||||
|
os.mkdir(make_dir)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# create shortcuts
|
||||||
|
# CSIDL_COMMON_PROGRAMS only available works on NT/2000/XP, and
|
||||||
|
# will fail there if the user has no admin rights.
|
||||||
|
fldr = get_shortcuts_folder()
|
||||||
|
# If the group doesn't exist, then we don't make shortcuts - its
|
||||||
|
# possible that this isn't a "normal" install.
|
||||||
|
if os.path.isdir(fldr):
|
||||||
|
dst = os.path.join(fldr, "PythonWin.lnk")
|
||||||
|
create_shortcut(
|
||||||
|
os.path.join(lib_dir, "Pythonwin\\Pythonwin.exe"),
|
||||||
|
"The Pythonwin IDE",
|
||||||
|
dst,
|
||||||
|
"",
|
||||||
|
sys.prefix,
|
||||||
|
)
|
||||||
|
file_created(dst)
|
||||||
|
if verbose:
|
||||||
|
print("Shortcut for Pythonwin created")
|
||||||
|
# And the docs.
|
||||||
|
if chm_file:
|
||||||
|
dst = os.path.join(fldr, "Python for Windows Documentation.lnk")
|
||||||
|
doc = "Documentation for the PyWin32 extensions"
|
||||||
|
create_shortcut(chm_file, doc, dst)
|
||||||
|
file_created(dst)
|
||||||
|
if verbose:
|
||||||
|
print("Shortcut to documentation created")
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print("Can't install shortcuts - %r is not a folder" % (fldr,))
|
||||||
|
except Exception as details:
|
||||||
|
print(details)
|
||||||
|
|
||||||
|
# importing win32com.client ensures the gen_py dir created - not strictly
|
||||||
|
# necessary to do now, but this makes the installation "complete"
|
||||||
|
try:
|
||||||
|
import win32com.client # noqa
|
||||||
|
except ImportError:
|
||||||
|
# Don't let this error sound fatal
|
||||||
|
pass
|
||||||
|
print("The pywin32 extensions were successfully installed.")
|
||||||
|
|
||||||
|
if is_bdist_wininst:
|
||||||
|
# Open a web page with info about the .exe installers being deprecated.
|
||||||
|
import webbrowser
|
||||||
|
|
||||||
|
try:
|
||||||
|
webbrowser.open("https://mhammond.github.io/pywin32_installers.html")
|
||||||
|
except webbrowser.Error:
|
||||||
|
print("Please visit https://mhammond.github.io/pywin32_installers.html")
|
||||||
|
|
||||||
|
|
||||||
|
def uninstall(lib_dir):
|
||||||
|
# First ensure our system modules are loaded from pywin32_system, so
|
||||||
|
# we can remove the ones we copied...
|
||||||
|
LoadSystemModule(lib_dir, "pywintypes")
|
||||||
|
LoadSystemModule(lib_dir, "pythoncom")
|
||||||
|
|
||||||
|
try:
|
||||||
|
RegisterCOMObjects(False)
|
||||||
|
except Exception as why:
|
||||||
|
print("Failed to unregister COM objects: %s" % (why,))
|
||||||
|
|
||||||
|
try:
|
||||||
|
RegisterHelpFile(False, lib_dir)
|
||||||
|
except Exception as why:
|
||||||
|
print("Failed to unregister help file: %s" % (why,))
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print("Unregistered help file")
|
||||||
|
|
||||||
|
try:
|
||||||
|
RegisterPythonwin(False, lib_dir)
|
||||||
|
except Exception as why:
|
||||||
|
print("Failed to unregister Pythonwin: %s" % (why,))
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print("Unregistered Pythonwin")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# remove gen_py directory.
|
||||||
|
gen_dir = os.path.join(lib_dir, "win32com", "gen_py")
|
||||||
|
if os.path.isdir(gen_dir):
|
||||||
|
shutil.rmtree(gen_dir)
|
||||||
|
if verbose:
|
||||||
|
print("Removed directory %s" % (gen_dir,))
|
||||||
|
|
||||||
|
# Remove pythonwin compiled "config" files.
|
||||||
|
pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
|
||||||
|
for fname in glob.glob(os.path.join(pywin_dir, "*.cfc")):
|
||||||
|
os.remove(fname)
|
||||||
|
|
||||||
|
# The dbi.pyd.old files we may have created.
|
||||||
|
try:
|
||||||
|
os.remove(os.path.join(lib_dir, "win32", "dbi.pyd.old"))
|
||||||
|
except os.error:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
os.remove(os.path.join(lib_dir, "win32", "dbi_d.pyd.old"))
|
||||||
|
except os.error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
except Exception as why:
|
||||||
|
print("Failed to remove misc files: %s" % (why,))
|
||||||
|
|
||||||
|
try:
|
||||||
|
fldr = get_shortcuts_folder()
|
||||||
|
for link in ("PythonWin.lnk", "Python for Windows Documentation.lnk"):
|
||||||
|
fqlink = os.path.join(fldr, link)
|
||||||
|
if os.path.isfile(fqlink):
|
||||||
|
os.remove(fqlink)
|
||||||
|
if verbose:
|
||||||
|
print("Removed %s" % (link,))
|
||||||
|
except Exception as why:
|
||||||
|
print("Failed to remove shortcuts: %s" % (why,))
|
||||||
|
# Now remove the system32 files.
|
||||||
|
files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
|
||||||
|
# Try the system32 directory first - if that fails due to "access denied",
|
||||||
|
# it implies a non-admin user, and we use sys.prefix
|
||||||
|
try:
|
||||||
|
for dest_dir in [get_system_dir(), sys.prefix]:
|
||||||
|
# and copy some files over there
|
||||||
|
worked = 0
|
||||||
|
for fname in files:
|
||||||
|
base = os.path.basename(fname)
|
||||||
|
dst = os.path.join(dest_dir, base)
|
||||||
|
if os.path.isfile(dst):
|
||||||
|
try:
|
||||||
|
os.remove(dst)
|
||||||
|
worked = 1
|
||||||
|
if verbose:
|
||||||
|
print("Removed file %s" % (dst))
|
||||||
|
except Exception:
|
||||||
|
print("FAILED to remove %s" % (dst,))
|
||||||
|
if worked:
|
||||||
|
break
|
||||||
|
except Exception as why:
|
||||||
|
print("FAILED to remove system files: %s" % (why,))
|
||||||
|
|
||||||
|
|
||||||
|
# NOTE: If this script is run from inside the bdist_wininst created
|
||||||
|
# binary installer or uninstaller, the command line args are either
|
||||||
|
# '-install' or '-remove'.
|
||||||
|
|
||||||
|
# Important: From inside the binary installer this script MUST NOT
|
||||||
|
# call sys.exit() or raise SystemExit, otherwise not only this script
|
||||||
|
# but also the installer will terminate! (Is there a way to prevent
|
||||||
|
# this from the bdist_wininst C code?)
|
||||||
|
|
||||||
|
|
||||||
|
def verify_destination(location):
|
||||||
|
if not os.path.isdir(location):
|
||||||
|
raise argparse.ArgumentTypeError('Path "{}" does not exist!'.format(location))
|
||||||
|
return location
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
|
description="""A post-install script for the pywin32 extensions.
|
||||||
|
|
||||||
|
* Typical usage:
|
||||||
|
|
||||||
|
> python pywin32_postinstall.py -install
|
||||||
|
|
||||||
|
If you installed pywin32 via a .exe installer, this should be run
|
||||||
|
automatically after installation, but if it fails you can run it again.
|
||||||
|
|
||||||
|
If you installed pywin32 via PIP, you almost certainly need to run this to
|
||||||
|
setup the environment correctly.
|
||||||
|
|
||||||
|
Execute with script with a '-install' parameter, to ensure the environment
|
||||||
|
is setup correctly.
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-install",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="Configure the Python environment correctly for pywin32.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-remove",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="Try and remove everything that was installed or copied.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-wait",
|
||||||
|
type=int,
|
||||||
|
help="Wait for the specified process to terminate before starting.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-silent",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help='Don\'t display the "Abort/Retry/Ignore" dialog for files in use.',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-quiet",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="Don't display progress messages.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-destination",
|
||||||
|
default=sysconfig.get_paths()["platlib"],
|
||||||
|
type=verify_destination,
|
||||||
|
help="Location of the PyWin32 installation",
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if not args.quiet:
|
||||||
|
print("Parsed arguments are: {}".format(args))
|
||||||
|
|
||||||
|
if not args.install ^ args.remove:
|
||||||
|
parser.error("You need to either choose to -install or -remove!")
|
||||||
|
|
||||||
|
if args.wait is not None:
|
||||||
|
try:
|
||||||
|
os.waitpid(args.wait, 0)
|
||||||
|
except os.error:
|
||||||
|
# child already dead
|
||||||
|
pass
|
||||||
|
|
||||||
|
silent = args.silent
|
||||||
|
verbose = not args.quiet
|
||||||
|
|
||||||
|
if args.install:
|
||||||
|
install(args.destination)
|
||||||
|
|
||||||
|
if args.remove:
|
||||||
|
if not is_bdist_wininst:
|
||||||
|
uninstall(args.destination)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
124
aimenv/Scripts/pywin32_testall.py
Normal file
124
aimenv/Scripts/pywin32_testall.py
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
"""A test runner for pywin32"""
|
||||||
|
import os
|
||||||
|
import site
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# locate the dirs based on where this script is - it may be either in the
|
||||||
|
# source tree, or in an installed Python 'Scripts' tree.
|
||||||
|
this_dir = os.path.dirname(__file__)
|
||||||
|
site_packages = [
|
||||||
|
site.getusersitepackages(),
|
||||||
|
] + site.getsitepackages()
|
||||||
|
|
||||||
|
failures = []
|
||||||
|
|
||||||
|
|
||||||
|
# Run a test using subprocess and wait for the result.
|
||||||
|
# If we get an returncode != 0, we know that there was an error, but we don't
|
||||||
|
# abort immediately - we run as many tests as we can.
|
||||||
|
def run_test(script, cmdline_extras):
|
||||||
|
dirname, scriptname = os.path.split(script)
|
||||||
|
# some tests prefer to be run from their directory.
|
||||||
|
cmd = [sys.executable, "-u", scriptname] + cmdline_extras
|
||||||
|
print("--- Running '%s' ---" % script)
|
||||||
|
sys.stdout.flush()
|
||||||
|
result = subprocess.run(cmd, check=False, cwd=dirname)
|
||||||
|
print("*** Test script '%s' exited with %s" % (script, result.returncode))
|
||||||
|
sys.stdout.flush()
|
||||||
|
if result.returncode:
|
||||||
|
failures.append(script)
|
||||||
|
|
||||||
|
|
||||||
|
def find_and_run(possible_locations, extras):
|
||||||
|
for maybe in possible_locations:
|
||||||
|
if os.path.isfile(maybe):
|
||||||
|
run_test(maybe, extras)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise RuntimeError(
|
||||||
|
"Failed to locate a test script in one of %s" % possible_locations
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
code_directories = [this_dir] + site_packages
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="A script to trigger tests in all subprojects of PyWin32."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-no-user-interaction",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="(This is now the default - use `-user-interaction` to include them)",
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"-user-interaction",
|
||||||
|
action="store_true",
|
||||||
|
help="Include tests which require user interaction",
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"-skip-adodbapi",
|
||||||
|
default=False,
|
||||||
|
action="store_true",
|
||||||
|
help="Skip the adodbapi tests; useful for CI where there's no provider",
|
||||||
|
)
|
||||||
|
|
||||||
|
args, remains = parser.parse_known_args()
|
||||||
|
|
||||||
|
# win32, win32ui / Pythonwin
|
||||||
|
|
||||||
|
extras = []
|
||||||
|
if args.user_interaction:
|
||||||
|
extras += ["-user-interaction"]
|
||||||
|
extras.extend(remains)
|
||||||
|
scripts = [
|
||||||
|
"win32/test/testall.py",
|
||||||
|
"Pythonwin/pywin/test/all.py",
|
||||||
|
]
|
||||||
|
for script in scripts:
|
||||||
|
maybes = [os.path.join(directory, script) for directory in code_directories]
|
||||||
|
find_and_run(maybes, extras)
|
||||||
|
|
||||||
|
# win32com
|
||||||
|
maybes = [
|
||||||
|
os.path.join(directory, "win32com", "test", "testall.py")
|
||||||
|
for directory in [
|
||||||
|
os.path.join(this_dir, "com"),
|
||||||
|
]
|
||||||
|
+ site_packages
|
||||||
|
]
|
||||||
|
extras = remains + ["1"] # only run "level 1" tests in CI
|
||||||
|
find_and_run(maybes, extras)
|
||||||
|
|
||||||
|
# adodbapi
|
||||||
|
if not args.skip_adodbapi:
|
||||||
|
maybes = [
|
||||||
|
os.path.join(directory, "adodbapi", "test", "adodbapitest.py")
|
||||||
|
for directory in code_directories
|
||||||
|
]
|
||||||
|
find_and_run(maybes, remains)
|
||||||
|
# This script has a hard-coded sql server name in it, (and markh typically
|
||||||
|
# doesn't have a different server to test on) but there is now supposed to be a server out there on the Internet
|
||||||
|
# just to run these tests, so try it...
|
||||||
|
maybes = [
|
||||||
|
os.path.join(directory, "adodbapi", "test", "test_adodbapi_dbapi20.py")
|
||||||
|
for directory in code_directories
|
||||||
|
]
|
||||||
|
find_and_run(maybes, remains)
|
||||||
|
|
||||||
|
if failures:
|
||||||
|
print("The following scripts failed")
|
||||||
|
for failure in failures:
|
||||||
|
print(">", failure)
|
||||||
|
sys.exit(1)
|
||||||
|
print("All tests passed \\o/")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
5
aimenv/pyvenv.cfg
Normal file
5
aimenv/pyvenv.cfg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
home = C:\Users\Egor\AppData\Local\Programs\Python\Python312
|
||||||
|
include-system-site-packages = false
|
||||||
|
version = 3.12.5
|
||||||
|
executable = C:\Users\Egor\AppData\Local\Programs\Python\Python312\python.exe
|
||||||
|
command = C:\Users\Egor\AppData\Local\Programs\Python\Python312\python.exe -m venv C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv
|
14
aimenv/share/jupyter/kernels/python3/kernel.json
Normal file
14
aimenv/share/jupyter/kernels/python3/kernel.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"argv": [
|
||||||
|
"python",
|
||||||
|
"-m",
|
||||||
|
"ipykernel_launcher",
|
||||||
|
"-f",
|
||||||
|
"{connection_file}"
|
||||||
|
],
|
||||||
|
"display_name": "Python 3 (ipykernel)",
|
||||||
|
"language": "python",
|
||||||
|
"metadata": {
|
||||||
|
"debugger": true
|
||||||
|
}
|
||||||
|
}
|
BIN
aimenv/share/jupyter/kernels/python3/logo-32x32.png
Normal file
BIN
aimenv/share/jupyter/kernels/python3/logo-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
aimenv/share/jupyter/kernels/python3/logo-64x64.png
Normal file
BIN
aimenv/share/jupyter/kernels/python3/logo-64x64.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
265
aimenv/share/jupyter/kernels/python3/logo-svg.svg
Normal file
265
aimenv/share/jupyter/kernels/python3/logo-svg.svg
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
version="1.0"
|
||||||
|
id="svg2"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||||
|
sodipodi:docname="python-logo-only.svg"
|
||||||
|
width="83.371017pt"
|
||||||
|
height="101.00108pt"
|
||||||
|
inkscape:export-filename="python-logo-only.png"
|
||||||
|
inkscape:export-xdpi="232.44"
|
||||||
|
inkscape:export-ydpi="232.44"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<metadata
|
||||||
|
id="metadata371">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:window-height="2080"
|
||||||
|
inkscape:window-width="1976"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
guidetolerance="10.0"
|
||||||
|
gridtolerance="10.0"
|
||||||
|
objecttolerance="10.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
id="base"
|
||||||
|
inkscape:zoom="2.1461642"
|
||||||
|
inkscape:cx="91.558698"
|
||||||
|
inkscape:cy="47.9926"
|
||||||
|
inkscape:window-x="1092"
|
||||||
|
inkscape:window-y="72"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
width="210mm"
|
||||||
|
height="40mm"
|
||||||
|
units="mm"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="pt"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-maximized="0" />
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2795">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#b8b8b8;stop-opacity:0.49803922;"
|
||||||
|
offset="0"
|
||||||
|
id="stop2797" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#7f7f7f;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop2799" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2787">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#7f7f7f;stop-opacity:0.5;"
|
||||||
|
offset="0"
|
||||||
|
id="stop2789" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#7f7f7f;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop2791" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3676">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#b2b2b2;stop-opacity:0.5;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3678" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#b3b3b3;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3680" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3236">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f4f4f4;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3244" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3240" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4671">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffd43b;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4673" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffe873;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop4675" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4689">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5a9fd4;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4691" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#306998;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4693" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="224.23996"
|
||||||
|
y1="144.75717"
|
||||||
|
x2="-65.308502"
|
||||||
|
y2="144.75717"
|
||||||
|
id="linearGradient2987"
|
||||||
|
xlink:href="#linearGradient4671"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)" />
|
||||||
|
<linearGradient
|
||||||
|
x1="172.94208"
|
||||||
|
y1="77.475983"
|
||||||
|
x2="26.670298"
|
||||||
|
y2="76.313133"
|
||||||
|
id="linearGradient2990"
|
||||||
|
xlink:href="#linearGradient4689"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4689"
|
||||||
|
id="linearGradient2587"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)"
|
||||||
|
x1="172.94208"
|
||||||
|
y1="77.475983"
|
||||||
|
x2="26.670298"
|
||||||
|
y2="76.313133" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4671"
|
||||||
|
id="linearGradient2589"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)"
|
||||||
|
x1="224.23996"
|
||||||
|
y1="144.75717"
|
||||||
|
x2="-65.308502"
|
||||||
|
y2="144.75717" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4689"
|
||||||
|
id="linearGradient2248"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)"
|
||||||
|
x1="172.94208"
|
||||||
|
y1="77.475983"
|
||||||
|
x2="26.670298"
|
||||||
|
y2="76.313133" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4671"
|
||||||
|
id="linearGradient2250"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(100.2702,99.61116)"
|
||||||
|
x1="224.23996"
|
||||||
|
y1="144.75717"
|
||||||
|
x2="-65.308502"
|
||||||
|
y2="144.75717" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4671"
|
||||||
|
id="linearGradient2255"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
|
||||||
|
x1="224.23996"
|
||||||
|
y1="144.75717"
|
||||||
|
x2="-65.308502"
|
||||||
|
y2="144.75717" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4689"
|
||||||
|
id="linearGradient2258"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
|
||||||
|
x1="172.94208"
|
||||||
|
y1="76.176224"
|
||||||
|
x2="26.670298"
|
||||||
|
y2="76.313133" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient2795"
|
||||||
|
id="radialGradient2801"
|
||||||
|
cx="61.518883"
|
||||||
|
cy="132.28575"
|
||||||
|
fx="61.518883"
|
||||||
|
fy="132.28575"
|
||||||
|
r="29.036913"
|
||||||
|
gradientTransform="matrix(1,0,0,0.177966,0,108.7434)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4671"
|
||||||
|
id="linearGradient1475"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
|
||||||
|
x1="150.96111"
|
||||||
|
y1="192.35176"
|
||||||
|
x2="112.03144"
|
||||||
|
y2="137.27299" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4689"
|
||||||
|
id="linearGradient1478"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
|
||||||
|
x1="26.648937"
|
||||||
|
y1="20.603781"
|
||||||
|
x2="135.66525"
|
||||||
|
y2="114.39767" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient2795"
|
||||||
|
id="radialGradient1480"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.7490565e-8,-0.23994696,1.054668,3.7915457e-7,-83.7008,142.46201)"
|
||||||
|
cx="61.518883"
|
||||||
|
cy="132.28575"
|
||||||
|
fx="61.518883"
|
||||||
|
fy="132.28575"
|
||||||
|
r="29.036913" />
|
||||||
|
</defs>
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient1478);fill-opacity:1"
|
||||||
|
d="M 54.918785,9.1927421e-4 C 50.335132,0.02221727 45.957846,0.41313697 42.106285,1.0946693 30.760069,3.0991731 28.700036,7.2947714 28.700035,15.032169 v 10.21875 h 26.8125 v 3.40625 h -26.8125 -10.0625 c -7.792459,0 -14.6157588,4.683717 -16.7499998,13.59375 -2.46181998,10.212966 -2.57101508,16.586023 0,27.25 1.9059283,7.937852 6.4575432,13.593748 14.2499998,13.59375 h 9.21875 v -12.25 c 0,-8.849902 7.657144,-16.656248 16.75,-16.65625 h 26.78125 c 7.454951,0 13.406253,-6.138164 13.40625,-13.625 v -25.53125 c 0,-7.2663386 -6.12998,-12.7247771 -13.40625,-13.9374997 C 64.281548,0.32794397 59.502438,-0.02037903 54.918785,9.1927421e-4 Z m -14.5,8.21875012579 c 2.769547,0 5.03125,2.2986456 5.03125,5.1249996 -2e-6,2.816336 -2.261703,5.09375 -5.03125,5.09375 -2.779476,-1e-6 -5.03125,-2.277415 -5.03125,-5.09375 -10e-7,-2.826353 2.251774,-5.1249996 5.03125,-5.1249996 z"
|
||||||
|
id="path1948" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient1475);fill-opacity:1"
|
||||||
|
d="m 85.637535,28.657169 v 11.90625 c 0,9.230755 -7.825895,16.999999 -16.75,17 h -26.78125 c -7.335833,0 -13.406249,6.278483 -13.40625,13.625 v 25.531247 c 0,7.266344 6.318588,11.540324 13.40625,13.625004 8.487331,2.49561 16.626237,2.94663 26.78125,0 6.750155,-1.95439 13.406253,-5.88761 13.40625,-13.625004 V 86.500919 h -26.78125 v -3.40625 h 26.78125 13.406254 c 7.792461,0 10.696251,-5.435408 13.406241,-13.59375 2.79933,-8.398886 2.68022,-16.475776 0,-27.25 -1.92578,-7.757441 -5.60387,-13.59375 -13.406241,-13.59375 z m -15.0625,64.65625 c 2.779478,3e-6 5.03125,2.277417 5.03125,5.093747 -2e-6,2.826354 -2.251775,5.125004 -5.03125,5.125004 -2.76955,0 -5.03125,-2.29865 -5.03125,-5.125004 2e-6,-2.81633 2.261697,-5.093747 5.03125,-5.093747 z"
|
||||||
|
id="path1950" />
|
||||||
|
<ellipse
|
||||||
|
style="opacity:0.44382;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.4174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="path1894"
|
||||||
|
cx="55.816761"
|
||||||
|
cy="127.70079"
|
||||||
|
rx="35.930977"
|
||||||
|
ry="6.9673119" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.4 KiB |
60
aimenv/share/man/man1/ipython.1
Normal file
60
aimenv/share/man/man1/ipython.1
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
.\" First parameter, NAME, should be all caps
|
||||||
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
.TH IPYTHON 1 "July 15, 2011"
|
||||||
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
|
.\"
|
||||||
|
.\" Some roff macros, for reference:
|
||||||
|
.\" .nh disable hyphenation
|
||||||
|
.\" .hy enable hyphenation
|
||||||
|
.\" .ad l left justify
|
||||||
|
.\" .ad b justify to both left and right margins
|
||||||
|
.\" .nf disable filling
|
||||||
|
.\" .fi enable filling
|
||||||
|
.\" .br insert line break
|
||||||
|
.\" .sp <n> insert n+1 empty lines
|
||||||
|
.\" for manpage-specific macros, see man(7) and groff_man(7)
|
||||||
|
.\" .SH section heading
|
||||||
|
.\" .SS secondary section heading
|
||||||
|
.\"
|
||||||
|
.\"
|
||||||
|
.\" To preview this page as plain text: nroff -man ipython.1
|
||||||
|
.\"
|
||||||
|
.SH NAME
|
||||||
|
ipython \- Tools for Interactive Computing in Python.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B ipython
|
||||||
|
.RI [ options ] " files" ...
|
||||||
|
|
||||||
|
.B ipython subcommand
|
||||||
|
.RI [ options ] ...
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
An interactive Python shell with automatic history (input and output), dynamic
|
||||||
|
object introspection, easier configuration, command completion, access to the
|
||||||
|
system shell, integration with numerical and scientific computing tools,
|
||||||
|
web notebook, Qt console, and more.
|
||||||
|
|
||||||
|
For more information on how to use IPython, see 'ipython \-\-help',
|
||||||
|
or 'ipython \-\-help\-all' for all available command\(hyline options.
|
||||||
|
|
||||||
|
.SH "ENVIRONMENT VARIABLES"
|
||||||
|
.sp
|
||||||
|
.PP
|
||||||
|
\fIIPYTHONDIR\fR
|
||||||
|
.RS 4
|
||||||
|
This is the location where IPython stores all its configuration files. The default
|
||||||
|
is $HOME/.ipython if IPYTHONDIR is not defined.
|
||||||
|
|
||||||
|
You can see the computed value of IPYTHONDIR with `ipython locate`.
|
||||||
|
|
||||||
|
.SH FILES
|
||||||
|
|
||||||
|
IPython uses various configuration files stored in profiles within IPYTHONDIR.
|
||||||
|
To generate the default configuration files and start configuring IPython,
|
||||||
|
do 'ipython profile create', and edit '*_config.py' files located in
|
||||||
|
IPYTHONDIR/profile_default.
|
||||||
|
|
||||||
|
.SH AUTHORS
|
||||||
|
IPython is written by the IPython Development Team <https://github.com/ipython/ipython>.
|
179
lab1.ipynb
Normal file
179
lab1.ipynb
Normal file
File diff suppressed because one or more lines are too long
19238
static/csv/car_price_prediction.csv
Normal file
19238
static/csv/car_price_prediction.csv
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user