Webb- och arbetsroller för Python med Python Tools för Visual Studio

Viktigt

Cloud Services (klassisk) är nu inaktuell för nya kunder och kommer att dras tillbaka den 31 augusti 2024 för alla kunder. 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

Anteckning

Du behöver ett Azure-konto för att genomföra kursen. 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 fungerar som värd för frontend-webbprogram, medan en arbetsroll kan köra asynkrona, tidskrävande eller beständiga uppgifter oberoende av användarinteraktion eller indata.

Mer information finns i Vad är en molntjänst?.

Anteckning

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.

Dialogrutan Nytt projekt

Du kan skapa nya webb- och arbetsroller i Azure Cloud Services-guiden.

Dialogrutan för Azure Cloud Services

Mallen för arbetsroller innehåller formaterad exempelkod för anslutning till ett Azure-lagringskonto eller till Azure Service Bus.

Molntjänstlösning

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.

Kommandot Lägg till roll

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.

Huvudproblemet 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 har skrivits för Python 3.8. Om du vill använda version 2.x av Python, ställer du in PYTHON2-variabelfilen till 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 .

<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

Anteckning

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 göra mycket förberedande arbete men det fungerar inte riktigt som tänkt. Ersätt innehållet i filen med följande skript.

Det här skriptet anropar worker.py-filen 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 ska ha skapat en ps.cmd-fil i . / bin-mappen. Detta gränssnittsskript anropar PowerShell-omslutningsskripten ovan och tillhandahåller loggning baserat på namnet på den anropade PowerShell-omslutningen. Detta är vad som bör finnas i den, om filen inte skapades.

@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"

Lokal körning

Om du definierar ditt molntjänstprojekt som startprojektet och trycker på F5 körs molntjänsten i den lokala Azure-emulatorn.

Även om PTVS har stöd för att starta i emulatorn så går det inte att felsöka (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.

Egenskaper för lösningens startprojekt

Publicera till Azure

När du vill publicera högerklickar du på molntjänstprojektet i lösningen och väljer Publicera.

Inloggning för publicering i Microsoft Azure

Följ 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 klickar du på Publicera.

Förloppet visas i utdatafönstret. Därefter visas fönstret med Microsoft Azure-aktivitetsloggen.

Fönstret med Microsoft Azure-aktivitetsloggen

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: