Sdílet prostřednictvím


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

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.

Dialogové okno Nový projekt

V průvodci cloudovou službou Azure můžete vytvořit novou webovou roli a roli pracovního procesu.

Dialog Cloudová služba Azure

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.

Řešení cloudových služeb

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

Příkaz pro přidání role

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

Vlastnosti projektu po spuštění pro řešení

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.

Přihlášení pro publikování v Microsoft Azure

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.

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: