如何在云服务中使用离线包发布 Python 应用程序
当用户使用 Azure 云服务发布 Python Work Role 应用程序时,在启动应用程序之前,需要先下载并安装 Python 环境,并且使用 pip 安装必需的第三方包。但这个过程中,往往会受到网络的影响导致下载失败,从而致使云服务应用启动失败。本文将介绍一种使用离线 Python 下载包安装 Python 运行环境,并缓存 pip 离线包来加速 Python 应用程序的启动的方法。
首先,我们需要按照官方推荐的方法来创建 Python Work Role 项目,具体可参考此文档:用于 Visual Studio 的 Python 工具中的 Python Web 角色和辅助角色。
之后,我们需要从 Python 官方网站下载离线安装包,并将其放置到项目脚本目录下。
然后,创建用来存放离线第三方包的 cache 目录,下载第三方依赖包,并放置到该目录下,Python 包的依赖可能比较复杂,我们可以执行以下命令下载依赖包,使用离线依赖的作用就是可以防止在云服务上再去下载依赖,减少云服务启动时间。
py -m pip download -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ -d cache --timeout 60
最后,修改 Python 脚本,使其能够使用本地包,来安装 Python 运行环境,参考以下完整脚本 :
$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine
if (-not $is_emulated){
Write-Output "Checking if python is installed...$nl"
if ($is_python2) {
& "${env:SystemDrive}\Python27\python.exe" -V | Out-Null
}
else {
py -V | Out-Null
}
if (-not $?) {
$outFile = "$(Get-Location)\python-3.5.2-amd64.exe"
if ($is_python2) {
$url = "https://www.python.org/ftp/python/2.7.12/python-2.7.12.amd64.msi"
$outFile = "${env:TEMP}\python-2.7.12.amd64.msi"
}
Write-Output "Install $outFile$nl"
if ($is_python2) {
Write-Output "Installing Python2$nl"
Start-Process msiexec.exe -ArgumentList "/q", "/i", "$outFile", "ALLUSERS=1" -Wait
}
else {
Write-Output "Installing Python3$nl"
Start-Process "$outFile" -ArgumentList "/quiet", "InstallAllUsers=1" -Wait
}
Write-Output "Done$nl"
}
else {
Write-Output "Already installed"
}
}
if (-not $is_emulated){
Write-Output "Checking if requirements.txt exists$nl"
if (Test-Path ..\requirements.txt) {
Write-Output "Found. Processing pip$nl"
if ($is_python2) {
cd..
& "${env:SystemDrive}\Python27\python.exe" -m pip download -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ -d cache --timeout 60
& "${env:SystemDrive}\Python27\python.exe" -m pip install -r requirements.txt --find-links cache
}
else {
cd..
Write-Output "Downloading Package$nl"
py -m pip download -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ -d cache --timeout 60
Write-Output "Installing Package$nl"
py -m pip install -r requirements.txt --find-links cache
}
Write-Output "Done$nl"
}
else {
Write-Output "Not found$nl"
}
}
通过以上操作,我们就可以使用离线包,在 Cloud Service 上安装 Python 运行环境,大大降低了出现问题的几率和发布的时间。