Webb- och arbetsroller för Python med Python Tools för Visual Studio
Viktigt!
Cloud Services (klassisk) är nu inaktuellt för alla kunder från och med den 1 september 2024. Alla befintliga distributioner som körs stoppas och stängs av av Microsoft och data kommer att förloras kontinuerligt från och med oktober 2024. Nya distributioner bör använda den nya Azure Resource Manager-baserade distributionsmodellen Azure Cloud Services (utökad support).
I den här artikeln ges en översikt över hur du använder webb- och arbetsroller för Python med hjälp av Python Tools för Visual Studio. Lär dig hur du använder Visual Studio för att skapa och distribuera en grundläggande molntjänst som använder Python.
Förutsättningar
- Visual Studio 2013, 2015 eller 2017
- Python Tools för Visual Studio (PTVS)
- Azure SDK Tools för Visual Studio (VS) 2013 eller
Azure SDK Tools för VS 2015 eller
Azure SDK Tools för VS 2017 - Python 2.7 32-bitars eller Python 3.8 32-bitars
Kommentar
Du behöver ett Azure-konto för att slutföra den här självstudien. Du kan aktivera dina Visual Studio-prenumerationsfördelar eller registrera dig för en kostnadsfri utvärderingsversion.
Vad är webb- och arbetsroller för Python?
Azure har tre beräkningsmodeller för att köra program: funktionen Web Apps i Azure App Service, Azure Virtual Machines och Azure Cloud Services. Alla tre modeller stöder Python. Cloud Services, där webb- och arbetsroller ingår, tillhandahåller plattform som en tjänst (PaaS). I en molntjänst tillhandahåller en webbroll en dedikerad IIS-webbserver (Internet Information Services) som värd för klientwebbprogram. En arbetsroll kan köra asynkrona, långvariga eller eviga uppgifter oberoende av användarinteraktion eller indata.
Mer information finns i Vad är en molntjänst?.
Kommentar
Vill du skapa en enkel webbplats?
Om ditt scenario bara är en enkel webbplats bör du överväga att använda den förenklade funktionen Web Apps i Azure App Service. Det är lätt att uppgradera till en molntjänst efter hand som webbplatsen växer och dina behov förändras. På Python Developer Center hittar du artiklar om utvecklingen av funktionen Web Apps i Azure App Service.
Skapa projekt
I Visual Studio kan du välja Azure Cloud Service i dialogrutan Nytt projekt under Python.
Du kan skapa nya webb- och arbetsroller i Azure Cloud Services-guiden.
Mallen för arbetsroller innehåller formaterad exempelkod för anslutning till ett Azure-lagringskonto eller till Azure Service Bus.
Du kan lägga till webb- eller arbetsroller till en befintlig molntjänst när som helst. Du kan välja att lägga till befintliga projekt i din lösning eller skapa nya.
Din molntjänst kan innehålla roller som implementeras på olika språk. Exempelvis kan en Python-webbroll implementeras med hjälp av Django, med Python, eller med C#-arbetsroller. Du kan enkelt kommunicera mellan dina roller med hjälp av Service Bus-köer eller lagringsköer.
Installera Python i molntjänsten
Varning
Installationsskripten som installeras med Visual Studio (när den här artikeln uppdaterades senast) fungerar inte. Det här avsnittet beskriver en lösning.
Det största problemet med installationsskripten är att de inte installerar Python. Definiera först två startaktiviteter i filen ServiceDefinition.csdef. Den första aktiviteten (PrepPython.ps1) hämtar och installerar Python-körningen. Den andra aktiviteten (PipInstaller.ps1) kör pip för att installera alla beroenden som du kan ha.
Följande skript skrevs för Python 3.8. Om du vill använda version 2.x av Python, ställer du in PYTHON2-variabelfilen till på för de båda startaktiviteterna och för körningsaktiviteten: <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>
Variablerna PYTHON2 och PYPATH måste läggas till arbetsstartsaktiviteten. PYPATH-variabeln används bara om PYTHON2-variabeln anges till på.
<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>
Exempel 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>
Skapa sedan filerna PrepPython.ps1 och PipInstaller.ps1 i din rolls . / bin-mapp.
PrepPython.ps1
Det här skriptet installerar Python. Om PYTHON2 miljövariabeln är inställd på på installeras Python 2.7, annars installeras 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
Det här skriptet ringer upp pip och installerar alla beroenden i requirements.txt-filen. Om PYTHON2 miljövariabeln är inställd på på används Python 2.7, annars används 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"
}
}
Ändra LaunchWorker.ps1
Kommentar
Vid ett arbetsrollprojekt krävs filen LauncherWorker.ps1 för att köra startfilen. Vid ett webbrollprojekt definieras startfilen istället i egenskaperna för projektet.
Bin \LaunchWorker.ps1 skapades ursprungligen för att utföra en hel del förberedelsearbete, men det fungerar inte riktigt. Ersätt innehållet i filen med följande skript.
Det här skriptet anropar filen worker.py från Python-projektet. Om PYTHON2 miljövariabeln är inställd på på används Python 2.7, annars används 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-mallarna skapade förmodligen en ps.cmd fil i mappen ./bin. Det här shell-skriptet anropar föregående PowerShell-omslutningsskript och tillhandahåller loggning baserat på namnet på PowerShell-omslutningen som heter. Om den här filen inte skapades skulle följande skript finnas i den:
@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"
Kör lokalt
Om du definierar ditt molntjänstprojekt som startprojektet och trycker på F5 körs molntjänsten i den lokala Azure-emulatorn.
Även om PTVS stöder start i emulatorn fungerar inte felsökning (till exempel brytpunkter).
Om du vill felsöka dina webb- och arbetsroller kan du konfigurera rollprojektet som startprojektet och felsöka det i stället. Du kan också ange flera startprojekt. Högerklicka på lösningen och välj Ange startprojekt.
Publicera till Azure
När du vill publicera högerklickar du på molntjänstprojektet i lösningen och väljer Publicera.
Följ stegen i guiden. Aktivera Fjärrskrivbord vid behov. Fjärrskrivbord är användbart när du behöver felsöka något.
När du har konfigurerat inställningarna väljer du Publicera.
Vissa förlopp visas i utdatafönstret och sedan visas fönstret Microsoft Azure-aktivitetslogg.
Distributionen tar flera minuter. När den är klar körs dina webb- och/eller arbetsroller i Azure!
Undersöka loggar
När den virtuella molntjänstdatorn startar och installerar Python, kan du titta på loggarna för att hitta eventuella felmeddelanden. Dessa loggar finns i mappen C:\Resources\Directory\{role}\LogFiles . PrepPython.err.txt har minst ett fel från när skriptet försöker identifiera om Python är installerat och PipInstaller.err.txt kan klaga över en inaktuell version av pip.
Nästa steg
Mer detaljerad information om hur du arbetar med webb- och arbetsroller i Python Tools för Visual Studio finns i dokumentationen till PTVS:
Mer information om hur du använder Azure-tjänster från dina webb- och arbetsroller, t.ex. Azure Storage eller Azure Service Bus, finns i följande artiklar: