採用 Python Tools for Visual Studio 的 Python Web 和背景工作角色
重要
截至 2024 年 9 月 1 日,所有客戶的雲端服務 (傳統) 均已淘汰。 自 2024 年 10 月起,Microsoft 將停止並關閉任何執行中的現有部署,且資料將永久遺失。 新部署應該使用 Azure Resource Manager 型的新部署模型 Azure 雲端服務 (延伸支援)。
本文提供在 Python Tools for Visual Studio 中使用 Python Web 和背景工作角色的概觀。 學習如何使用 Visual Studio 來建立和部署使用 Python 的基本雲端服務。
必要條件
- Visual Studio 2013、2015 或 2017
- Python Tools for Visual Studio (PTVS)
- Azure SDK Tools for Visual Studio (VS) 2013 或
Azure SDK Tools for VS 2015 或
Azure SDK Tools for VS 2017 - Python 2.7 32 位元或 Python 3.8 32 位元
注意
若要完成此教學課程,您需要 Azure 帳戶。 您可以啟用自己的 Visual Studio 訂閱者權益或是申請免費試用。
什麼是 Python Web 和背景工作角色?
Azure 提供三種運算模型來執行應用程式:Azure App Service 中的 Web Apps 功能、Azure 虛擬機器和Azure 雲端服務。 這三種模型都支援 Python。 雲端服務 (包含 Web 和背景工作角色) 可提供平台即服務 (PaaS)。 在雲端服務中,Web 角色提供專用的 Internet Information Services (IIS) Web 伺服器來裝載前端 Web 應用程式。 背景工作角色可執行非同步、長時間執行或永久的工作,且不受使用者互動或輸入影響。
如需詳細資訊,請參閱什麼是雲端服務? (英文)。
注意
尋求建置簡單的網站?
如果您的案例只需要簡單的網站前端,請考慮使用 Azure App Service 中的輕量型 Web Apps 功能。 隨著網站擴大,以及需求改變,您可以很輕易地升級到雲端服務。 請參閱 Python 開發人員中心,尋找 Azure App Service 中的 Web Apps 功能開發的相關文章。
建立專案
在 Visual Studio 中,您可以在 [Python] 下選取 [新增專案] 對話方塊中的 [Azure 雲端服務]。
在 [Azure 雲端服務] 精靈中,您可以建立新的 Web 和背景工作角色。
背景工作角色範本隨附未定案程式碼,可連接至 Azure 儲存體帳戶或 Azure 服務匯流排。
您可以隨時將 Web 或背景工作角色加入至現有的雲端服務。 您可以選擇加入方案中現有的專案,或建立新專案。
雲端服務可以包含以不同語言實作的角色。 例如,您可以有使用 Django 實作的 Python Web 角色,以及 Python 或 C# 背景工作角色。 您可以使用服務匯流排佇列或儲存體佇列,輕鬆地與角色進行通訊。
在雲端服務上安裝 Python
警告
與 Visual Studio 一起安裝的安裝指令碼 (在這篇文章上次更新時) 無法運作。 本節說明因應措施。
安裝指令碼的主要問題是其未安裝 Python。 首先,在 ServiceDefinition.csdef 檔案中定義兩個啟動工作。 第一個工作 (PrepPython.ps1) 會下載並安裝 Python 執行階段。 第二個工作 (PipInstaller.ps1) 會執行 pip 以安裝您可能具有的任何相依項目。
下列指令碼是針對 Python 3.8 而撰寫。 如果您想要使用 2.x 版的 python,請針對兩個啟動工作以及執行階段工作將 PYTHON2 變數檔案設定為 [on]︰<Variable name="PYTHON2" value="<mark>on</mark>" />
。
<Startup>
<Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PrepPython.ps1">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
</Environment>
</Task>
<Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PipInstaller.ps1">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
</Environment>
</Task>
</Startup>
PYTHON2 和 PYPATH 變數必須新增至背景工作啟動工作。 只有在 PYTHON2 變數設定為 [on] 時,才會使用 PYPATH 變數。
<Runtime>
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
<Variable name="PYPATH" value="%SystemDrive%\Python27" />
</Environment>
<EntryPoint>
<ProgramEntryPoint commandLine="bin\ps.cmd LaunchWorker.ps1" setReadyOnProcessStart="true" />
</EntryPoint>
</Runtime>
範例 ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudServicePython" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<WorkerRole name="WorkerRole1" vmsize="Small">
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" />
<Setting name="Python2" />
</ConfigurationSettings>
<Startup>
<Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PrepPython.ps1">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
</Environment>
</Task>
<Task executionContext="elevated" taskType="simple" commandLine="bin\ps.cmd PipInstaller.ps1">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
</Environment>
</Task>
</Startup>
<Runtime>
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
<Variable name="PYTHON2" value="off" />
<Variable name="PYPATH" value="%SystemDrive%\Python27" />
</Environment>
<EntryPoint>
<ProgramEntryPoint commandLine="bin\ps.cmd LaunchWorker.ps1" setReadyOnProcessStart="true" />
</EntryPoint>
</Runtime>
<Imports>
<Import moduleName="RemoteAccess" />
<Import moduleName="RemoteForwarder" />
</Imports>
</WorkerRole>
</ServiceDefinition>
接下來,在角色的 ./bin 資料夾中建立 Next, create the PrepPython.ps1 和 PipInstaller.ps1 檔案。
PrepPython.ps1
此指令碼會安裝 python。 如果 PYTHON2 環境變數設定為 [on],則會安裝 Python 2.7,否則會安裝 Python 3.8。
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$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 $?) {
$url = "https://www.python.org/ftp/python/3.8.8/python-3.8.8-amd64.exe"
$outFile = "${env:TEMP}\python-3.8.8-amd64.exe"
if ($is_python2) {
$url = "https://www.python.org/ftp/python/2.7.18/python-2.7.18.amd64.msi"
$outFile = "${env:TEMP}\python-2.7.18.amd64.msi"
}
Write-Output "Not found, downloading $url to $outFile$nl"
Invoke-WebRequest $url -OutFile $outFile
Write-Output "Installing$nl"
if ($is_python2) {
Start-Process msiexec.exe -ArgumentList "/q", "/i", "$outFile", "ALLUSERS=1" -Wait
}
else {
Start-Process "$outFile" -ArgumentList "/quiet", "InstallAllUsers=1" -Wait
}
Write-Output "Done$nl"
}
else {
Write-Output "Already installed"
}
}
PipInstaller.ps1
此指令碼會叫出 pip 並安裝 requirements.txt 檔案中的所有相依項目。 如果 PYTHON2 環境變數設定為 [on],則會使用 Python 2.7,否則會使用 Python 3.8。
$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine
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) {
& "${env:SystemDrive}\Python27\python.exe" -m pip install -r ..\requirements.txt
}
else {
py -m pip install -r ..\requirements.txt
}
Write-Output "Done$nl"
}
else {
Write-Output "Not found$nl"
}
}
修改 LaunchWorker.ps1
注意
如果是背景工作角色專案,則需要 LauncherWorker.ps1 檔案才能執行啟動檔。 在 Web 角色專案中,啟動檔已定義於專案屬性中。
最初建立 bin\LaunchWorker.ps1 是為了進行許多準備工作,但未真正發生作用。 以下列指令碼取代該檔案中的內容。
此指令碼會從 Python 專案呼叫 worker.py 檔案。 如果 PYTHON2 環境變數設定為 [on],則會使用 Python 2.7,否則會使用 Python 3.8。
$is_emulated = $env:EMULATED -eq "true"
$is_python2 = $env:PYTHON2 -eq "on"
$nl = [Environment]::NewLine
if (-not $is_emulated)
{
Write-Output "Running worker.py$nl"
if ($is_python2) {
cd..
iex "$env:PYPATH\python.exe worker.py"
}
else {
cd..
iex "py worker.py"
}
}
else
{
Write-Output "Running (EMULATED) worker.py$nl"
# Customize to your local dev environment
if ($is_python2) {
cd..
iex "$env:PYPATH\python.exe worker.py"
}
else {
cd..
iex "py worker.py"
}
}
ps.cmd
Visual Studio 範本應已在 ./bin 資料夾中建立 ps.cmd 檔案。 此殼層指令碼會呼叫上述 PowerShell 包裝函式指令碼,並根據呼叫的 PowerShell 包裝函式名稱提供記錄。 若未建立此檔案,則會是下列指令碼:
@echo off
cd /D %~dp0
if not exist "%DiagnosticStore%\LogFiles" mkdir "%DiagnosticStore%\LogFiles"
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -File %* >> "%DiagnosticStore%\LogFiles\%~n1.txt" 2>> "%DiagnosticStore%\LogFiles\%~n1.err.txt"
在本機執行
如果您將雲端服務專案設為啟始專案並按下 F5,雲端服務會在本機 Azure 模擬器中執行。
雖然 PTVS 支援在模擬器中啟動,但偵錯無法運作 (例如,中斷點)。
若要對 Web 和背景工作角色進行偵錯,您可以將角色專案設為啟始專案,然後偵錯。 您也可以設定多個啟始專案。 以滑鼠右鍵按一下方案,然後選取 [設定啟始專案]。
發佈至 Azure
若要發佈,請以滑鼠右鍵按一下方案中的雲端服務專案,然後選取 [發佈]。
遵循精靈進行。 如有需要,請啟用遠端桌面。 當您需要進行偵錯時,遠端桌面很實用。
完成設定時,請選擇 [發佈]。
輸出視窗中會顯示一些進度,接著會出現 [Microsoft Azure 活動記錄] 視窗。
部署需要幾分鐘才能完成,然後 Web 及/或背景工作角色就會在 Azure 上運作!
調查記錄
雲端服務虛擬機器啟動並安裝 Python 之後,您可以查看記錄,以找出任何失敗訊息。 這些記錄位於 C:\Resources\Directory\{role}\LogFiles 資料夾中。 當指令碼嘗試偵測是否已安裝 Python 時,PrepPython.err.txt 中至少會有一個錯誤,而 PipInstaller.err.txt 可能會抱怨 pip 的版本過時。
下一步
如需在 Python Tools for Visual Studio 中使用 Web 和背景工作角色的相關詳細資訊,請參閱 PTVS 文件:
如需有關從 Web 和背景工作角色使用 Azure 服務的詳細資訊,例如使用 Azure 儲存體或服務匯流排,請參閱下列文章: