Dela via


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

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.

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.

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

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.

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 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.

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: