#!/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]::Tls12 function 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 # 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 /passive 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." } # Python 3.8 $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 # Python 3.9 $Python39x86Config = @{ PythonVersion = "3.9.0" PythonInstaller = "python-3.9.0" PythonInstallPath = "C:\Python39_32bit" PythonInstallerHash = "4a2812db8ab9f2e522c96c7728cfcccb" } Install-Python @Python39x86Config $Python39x64Config = @{ PythonVersion = "3.9.0" PythonInstaller = "python-3.9.0-amd64" PythonInstallPath = "C:\Python39" PythonInstallerHash = "b61a33dc28f13b561452f3089c87eb63" } Install-Python @Python39x64Config # Python 3.10 $Python310x86Config = @{ PythonVersion = "3.10.0" PythonInstaller = "python-3.10.0rc1" PythonInstallPath = "C:\Python310_32bit" PythonInstallerHash = "6de353f2f7422aa030d4ccc788ffa75e" } Install-Python @Python310x86Config $Python310x64Config = @{ PythonVersion = "3.10.0" PythonInstaller = "python-3.10.0rc1-amd64" PythonInstallPath = "C:\Python310" PythonInstallerHash = "39135519b044757f0a3b09d63612b0da" } Install-Python @Python310x64Config