| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | #!/usr/bin/env powershell# Install Python 3.8 for x64 and x86 in order to build wheels on Windows.Set-StrictMode -Version 2$ErrorActionPreference = 'Stop'trap {    $ErrorActionPreference = "Continue"    Write-Error $_    exit 1}# Avoid "Could not create SSL/TLS secure channel"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12function Install-Python {    Param(        [string]$PythonVersion,        [string]$PythonInstaller,        [string]$PythonInstallPath,        [string]$PythonInstallerHash    )    $PythonInstallerUrl = "https://www.python.org/ftp/python/$PythonVersion/$PythonInstaller.exe"    $PythonInstallerPath = "C:\tools\$PythonInstaller.exe"    # Downloads installer    Write-Host "Downloading the Python installer: $PythonInstallerUrl => $PythonInstallerPath"    Invoke-WebRequest -Uri $PythonInstallerUrl -OutFile $PythonInstallerPath -MaximumRetryCount 3    # Validates checksum    $HashFromDownload = Get-FileHash -Path $PythonInstallerPath -Algorithm MD5    if ($HashFromDownload.Hash -ne $PythonInstallerHash) {        throw "Invalid Python installer: failed checksum!"    }    Write-Host "Python installer $PythonInstallerPath validated."    # Installs Python    & $PythonInstallerPath /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 TargetDir=$PythonInstallPath    if (-Not $?) {        throw "The Python installation exited with error!"    }    # NOTE(lidiz) Even if the install command finishes in the script, that    # doesn't mean the Python installation is finished. If using "ps" to check    # for running processes, you might see ongoing installers at this point.    # So, we needs this "hack" to reliably validate that the Python binary is    # functioning properly.    # Wait for the installer process    Wait-Process -Name $PythonInstaller -Timeout 300    Write-Host "Installation process exits normally."    # Validate Python binary    $PythonBinary = "$PythonInstallPath\python.exe"    & $PythonBinary -c 'print(42)'    Write-Host "Python binary works properly."    # Installs pip    & $PythonBinary -m ensurepip --user    Write-Host "Python $PythonVersion installed by $PythonInstaller at $PythonInstallPath."}$Python38x86Config = @{    PythonVersion = "3.8.0"    PythonInstaller = "python-3.8.0"    PythonInstallPath = "C:\Python38_32bit"    PythonInstallerHash = "412a649d36626d33b8ca5593cf18318c"}Install-Python @Python38x86Config$Python38x64Config = @{    PythonVersion = "3.8.0"    PythonInstaller = "python-3.8.0-amd64"    PythonInstallPath = "C:\Python38"    PythonInstallerHash = "29ea87f24c32f5e924b7d63f8a08ee8d"}Install-Python @Python38x64Config
 |