Webové role a role pracovních procesů Pythonu při použití nástrojů Python Tools for Visual Studio
Důležité
Cloud Services (classic) je teď pro nové zákazníky zastaralý a bude vyřazen 31. srpna 2024 pro všechny zákazníky. Nová nasazení by měla používat nový model nasazení Azure Resource Manager založený na Azure Cloud Services (rozšířená podpora).
Tento článek obsahuje přehled používání webových rolí a rolí pracovních procesů 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 VS 2013 nebo
Azure SDK Tools for VS 2015 nebo
Azure SDK Tools for VS 2017 - Python 2.7 (32bitová verze) nebo Python 3.8 (32bitová verze)
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žby (IIS) pro hostování front-endových webových aplikací, zatímco role pracovních procesů dokážou spouštět asynchronní, dlouhotrvající nebo trvalé úlohy, které jsou nezávislé na vstupu nebo interakci uživatelů.
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ě
Upozornění
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í problém se skripty pro nastavení spočívá v tom, ž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 pro 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 hodnotu on, 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 hodnotu on, 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.
Soubor bin\LaunchWorker.ps1 byl původně vytvořen pro větší množství přípravných prací, ve skutečnosti však tento cíl neplní. 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 hodnotu on, 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 služby Visual Studio měly vytvořit soubor ps.cmd ve složce ./bin. Tento skript prostředí volá obálkové skripty prostředí PowerShell uvedené výše a zajišťuje protokolování na základě názvu volaného obálkového skriptu prostředí PowerShell. Pokud tento soubor nebyl vytvořen, zde je uveden jeho očekávaný obsah.
@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"
Spuštění v místním prostředí
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.
Nástroje PTVS sice podporují spouštění v emulátoru, nebude ale fungovat ladění (například zarážky).
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 pokynů průvodce. 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í nastavení konfigurace klikněte na Publikovat.
V okně výstupu uvidíte průběh a pak se zobrazí okno Protokoly 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: