Webové role a role pracovních procesů Pythonu při použití nástrojů Python Tools for Visual Studio
Důležité
Od 1. září 2024 je služba Cloud Services (Classic) pro všechny zákazníky zastaralá. Microsoft zastaví a vypne všechna stávající spuštěná nasazení a data se od října 2024 trvale ztratí. Nová nasazení by měla používat nový model nasazení založený na Azure Resource Manageru na Azure Cloud Services (rozšířená podpora).
Tento článek obsahuje přehled používání webových rolí a rolí pracovních procesů Python pomocí nástrojů Python Tools for Visual Studio. Dozvíte se, jak použít službu Visual Studio k vytvoření a nasazení základní cloudové služby, která používá Python.
Požadavky
- Visual Studio 2013, 2015 nebo 2017
- Python Tools for Visual Studio (PTVS)
- Azure SDK Tools for Visual Studio (VS) 2013 nebo
Azure SDK Tools for VS 2015 nebo
Azure SDK Tools for VS 2017 - Python 2.7 32bitová nebo 32bitová verze Pythonu 3.8
Poznámka:
K dokončení tohoto kurzu potřebujete mít účet Azure. Můžete si aktivovat výhody předplatitele sady Visual Studio nebo si zaregistrovat bezplatnou zkušební verzi.
Co jsou webové role a role pracovních procesů Pythonu?
Azure nabízí tři počítačové modely pro spouštění aplikací: funkci Web Apps v Azure App Service, Azure Virtual Machines a Azure Cloud Services. Všechny tři modely podporují Python. Služby Cloud Services, které obsahují webové role a role pracovních procesů, zajišťují PaaS (Platform as a Service). Webová role v rámci cloudové služby poskytuje vyhrazený webový server Internetová informační služba (IIS) pro hostování webových aplikací front-endu. Role pracovního procesu může spouštět asynchronní, dlouhotrvající nebo trvalé úlohy nezávislé na interakci nebo vstupu uživatele.
Další informace najdete v článku Co je cloudová služba?.
Poznámka:
Chcete si vytvořit jednoduchý web?
Pokud váš scénář zahrnuje jen jednoduchý front-endový web, zvažte použití odlehčené funkce Web Apps v rámci Azure App Service. V případě potřeby budete moct snadno upgradovat na Cloud Service, až se váš web rozroste a vaše požadavky se změní. Ve středisku pro vývojáře programující v Pythonu najdete články věnované vývoji funkce Web Apps v rámci Azure App Service.
Vytvoření projektu
V sadě Visual Studio můžete v dialogovém okně Nový projekt v části Python vybrat Cloudová služba Azure.
V průvodci cloudovou službou Azure můžete vytvořit novou webovou roli a roli pracovního procesu.
Součástí šablony role pracovního procesu je často používaný kód k připojení k účtu služeb Azure Storage nebo Azure Service Bus.
Do existující cloudové služby můžete kdykoli přidat webovou roli nebo roli pracovního procesu. Můžete je buď přidat do existujících projektů ve vašem řešení, nebo můžete vytvořit nové.
Cloudové služby můžou obsahovat role implementované v různých jazycích. Můžete mít například webovou roli Pythonu implementovanou pomocí rolí pracovního procesu Django, Python nebo C#. Mezi svými rolemi můžete snadno komunikovat pomocí front služeb Storage nebo Service Bus.
Instalace Pythonu v cloudové službě
Upozorňující
Skripty pro nastavení, které jsou nainstalovány se službou Visual Studio (v době poslední instalace tohoto článku), nefungují. Tato část popisuje alternativní řešení.
Hlavním problémem instalačních skriptů je, že neinstalují Python. Nejprve definujte dvě počáteční úlohy v souboru ServiceDefinition.csdef. První úloha (PrepPython.ps1) stáhne a nainstaluje modul runtime Pythonu. Druhá úloha (PipInstaller.ps1) spustí program pip, který nainstaluje všechny případné závislosti.
Následující skripty byly napsány tak, aby cílily na Python 3.8. Pokud chcete použít verzi 2.x Pythonu, nastavte soubor proměnné PYTHON2 na hodnotu on pro obě počáteční úlohy spuštění a úlohu runtime: <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>
Proměnné PYTHON2 a PYPATH je třeba přidat do počáteční úlohy pracovního procesu. Proměnná PYPATH se použije pouze v případě, že je proměnná PYTHON2 nastavena na hodnotu on.
<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>
Ukázkový soubor 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>
Dále vytvořte soubory PrepPython.ps1 a PipInstaller.ps1 ve složce ./bin vaší role.
PrepPython.ps1
Tento skript nainstaluje Python. Pokud je proměnná prostředí PYTHON2 nastavená na zapnutou, nainstaluje se Python 2.7, jinak se nainstaluje 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
Tento skript volá program pip a instaluje všechny závislosti v souboru requirements.txt. Pokud je proměnná prostředí PYTHON2 nastavená na zapnutou, použije se Python 2.7, jinak se použije 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"
}
}
Úprava souboru LaunchWorker.ps1
Poznámka:
V případě projektu role pracovního procesu je ke spuštění spouštěcího souboru vyžadován soubor LauncherWorker.ps1. U projektu webové role je spouštěcí soubor definován ve vlastnostech projektu.
Bin \LaunchWorker.ps1 byl původně vytvořen k provedení velkého množství přípravných prací, ale ve skutečnosti nefunguje. Nahraďte obsah daného souboru následujícím skriptem.
Tento skript volá soubor worker.py z projektu Pythonu. Pokud je proměnná prostředí PYTHON2 nastavená na zapnutou, použije se Python 2.7, jinak se použije 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
Šablony sady Visual Studio pravděpodobně vytvořily soubor ps.cmd ve složce ./bin . Tento skript prostředí volá předchozí skripty obálky PowerShellu a poskytuje protokolování na základě názvu obálky PowerShellu. Pokud se tento soubor nevytvořil, bude v něm následující skript:
@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"
Spusťte místně .
Pokud si projekt cloudové služby nastavíte jako projekt po spuštění a stisknete F5, spustí se cloudová služba v emulátoru místního prostředí Azure.
I když PTVS podporuje spouštění v emulátoru, ladění (například zarážky) nefunguje.
Když budete chtít webové role a role pracovních procesů ladit, můžete jako projekt po spuštění nastavit projekt role a ladit místo toho ten. Můžete také nastavit více projektů po spuštění. Klikněte pravým tlačítkem myši na řešení a pak vyberte Nastavit projekty po spuštění.
Publikování do Azure
Když budete chtít aplikaci publikovat, klikněte pravým tlačítkem na projekt cloudové služby v řešení a pak vyberte Publikovat.
Postupujte podle kroků v průvodci. V případě potřeby povolte vzdálenou plochu. Vzdálená plocha je užitečné, když potřebujete něco ladit.
Po dokončení konfigurace nastavení zvolte Publikovat.
V okně výstupu se zobrazí nějaký průběh a pak se zobrazí okno Protokolu aktivit Microsoft Azure.
Pár minut bude probíhat nasazování a pak už vám na Azure začne běžet webová role a role pracovního procesu.
Prozkoumání protokolů
Po spuštění virtuálního počítače cloudové služby a instalaci Pythonu si můžete prohlédnou protokoly a hledat případné zprávy o neúspěchu. Tyto protokoly jsou umístěné ve složce C:\Resources\Directory\{role}\LogFiles . Soubor PrepPython.err.txt obsahuje alespoň jednu chybu, protože se skript pokusil zjistit, zda je nainstalován Python, a soubor PipInstaller.err.txt může obsahovat zprávu ohledně zastaralé verze programu pip.
Další kroky
Další podrobné informace o práci s webovými rolemi a rolemi pracovních procesů v nástrojích Python Tools for Visual Studio najdete v dokumentaci k těmto nástrojům:
Další podrobnosti o používání služeb Azure z vaší webové role a role pracovního procesu, například pomocí služeb Azure Storage nebo Azure Service Bus, najdete v následujících článcích: