Udostępnij przez


Role sieci webowe i robocze języka Python z programem Python Tools for Visual Studio

Ważne

Usługi Cloud Services (wersja klasyczna) są teraz przestarzałe dla wszystkich klientów od 1 września 2024 r. Wszystkie istniejące uruchomione wdrożenia zostaną zatrzymane i zamknięte przez firmę Microsoft, a dane zostaną trwale utracone od października 2024 r. Nowe wdrożenia powinny używać nowego modelu wdrażania opartego na usłudze Azure Resource Manager w usługach Azure Cloud Services (wsparcie dodatkowe).

Ten artykuł zawiera omówienie sposobu użycia ról webowych i roboczych języka Python za pomocą narzędzi Python Tools for Visual Studio. Dowiedz się, jak używać programu Visual Studio do tworzenia i wdrażania podstawowej usługi w chmurze, która używa języka Python.

Wymagania wstępne

Uwaga

Do wykonania kroków tego samouczka potrzebne jest konto platformy Azure. Możesz aktywować korzyści dla subskrybentów programu Visual Studio lub zarejestrować się w celu uzyskania bezpłatnego demo.

Jakie są role webowe i pracownicze w Pythonie?

Platforma Azure udostępnia trzy modele obliczeniowe na potrzeby uruchamiania aplikacji: funkcja Web Apps w usłudze Azure App Service, Azure Virtual Machines i Azure Cloud Services. Wszystkie trzy modele obsługują język Python. Usługi chmurowe, które obejmują role internetowe i role robocze, udostępniają rozwiązanie typu Platforma jako usługa (Platform as a Service, PaaS). W ramach usługi w chmurze rola sieci Web zapewnia dedykowany serwer WWW dla usług Internet Information Services (IIS) do hostowania frontendowych aplikacji internetowych. Rola robocza może uruchamiać zadania asynchroniczne, długotrwałe lub wieczyste, niezależnie od interakcji z użytkownikiem lub jego danych wejściowych.

Aby uzyskać więcej informacji, zobacz Co to jest usługa w chmurze?

Uwaga

Chcesz utworzyć prostą witrynę sieci Web? Jeśli Twój scenariusz obejmuje tylko prosty frontend witryny internetowej, rozważ użycie lekkiej funkcji aplikacji webowych w usłudze Azure App Service. Możesz łatwo przeprowadzić uaktualnienie do usługi w chmurze w przypadku rozwoju witryny sieci Web lub zmiany wymagań. W Centrum dla deweloperów języka Python znajdziesz artykuły, które dotyczą rozwoju funkcji Web Apps w usłudze Azure App Service.

Tworzenie projektu

W programie Visual Studio możesz wybrać pozycję Usługa w chmurze platformy Azure w oknie dialogowym Nowy projekt w obszarze Python.

Okno dialogowe Nowy projekt

W kreatorze usługi Azure Cloud Service można utworzyć nowe role web i worker.

Okno dialogowe usługi chmurowej platformy Azure

Szablon roli procesu roboczego zawiera kod szablonowy do nawiązywania połączenia z kontem usługi Azure Storage lub z usługą Azure Service Bus.

Rozwiązanie usługi w chmurze

W każdej chwili można dodać role webowe lub robotnicze do istniejącej usługi w chmurze. Możesz dodawać istniejące projekty do rozwiązania lub tworzyć nowe.

Polecenie Dodaj rolę

Usługa w chmurze może zawierać role zaimplementowane w różnych językach. Na przykład możesz mieć rolę webową zaimplementowaną w Pythonie korzystając z Django, lub rolę procesu roboczego zaimplementowaną w C#. Możesz łatwo komunikować się między rolami, używając kolejek usługi Service Bus lub kolejek magazynowych.

Instalowanie języka Python w usłudze w chmurze

Ostrzeżenie

Skrypty instalacji instalowane z programem Visual Studio (w momencie ostatniej aktualizacji artykułu) nie działają. W tej sekcji opisano sposób obejścia problemu.

Głównym problemem ze skryptami konfiguracji jest to, że nie instalują języka Python. Najpierw należy zdefiniować dwa zadania uruchamiania w pliku ServiceDefinition.csdef. Pierwsze zadanie (PrepPython.ps1) pobiera i instaluje środowiska uruchomieniowe języka Python. Drugie zadanie (PipInstaller.ps1) uruchamia pip, aby zainstalować wszystkie wymagane zależności.

Następujące skrypty zostały napisane dla języka Python w wersji 3.8. Jeśli chcesz korzystać z wersji 2.x języka Python, ustaw plik zmiennej PYTHON2 na on dla dwóch zadań uruchamiania i zadania środowiska uruchomieniowego: <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>

Zmienne PYTHON2 i PYPATH muszą zostać dodane do zadania uruchamiania procesu roboczego. Zmienna PYPATH jest używana tylko wtedy, gdy zmienna PYTHON2 jest ustawiona na wartość 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>

Przykładowy plik 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>

Następnie należy utworzyć pliki PrepPython.ps1 i PipInstaller.ps1 w folderze ./bin roli użytkownika.

PrepPython.ps1

Ten skrypt instaluje język Python. Jeśli zmienna środowiskowa PYTHON2 jest włączona, zostanie zainstalowany język Python 2.7. W przeciwnym razie jest zainstalowany język 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

Ten skrypt wywołuje kod pip i instaluje wszystkie zależności w pliku requirements.txt. Jeśli zmienna środowiskowa PYTHON2 jest ustawiona na włączoną, używany jest język Python 2.7. W przeciwnym razie jest używany język 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"
    }
}

Modyfikowanie skryptu LaunchWorker.ps1

Uwaga

W przypadku projektu roli roboczej plik LauncherWorker.ps1 jest wymagany do uruchomienia pliku startowego. W projekcie web role plik uruchamiania jest określony w właściwościach projektu.

Bin \LaunchWorker.ps1 został pierwotnie utworzony, aby wykonać wiele prac przygotowawczych, ale tak naprawdę nie działa. Zastąp zawartość tego pliku następującym skryptem.

Ten skrypt wywołuje plik worker.py z projektu języka Python. Jeśli zmienna środowiskowa PYTHON2 jest ustawiona na włączoną, używany jest język Python 2.7. W przeciwnym razie jest używany język 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

Szablony programu Visual Studio prawdopodobnie utworzyły plik ps.cmd w folderze ./bin . Ten skrypt powłoki wywołuje wcześniejsze skrypty otoki programu PowerShell i umożliwia rejestrowanie na podstawie nazwy otoki programu PowerShell. Jeśli ten plik nie został utworzony, w nim znajduje się następujący skrypt:

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

Uruchamianie lokalne

Jeśli ustawisz projekt usługi w chmurze jako projekt startowy i naciśniesz klawisz F5, usługa w chmurze zostanie uruchomiona w lokalnym emulatorze platformy Azure.

Mimo że funkcja PTVS obsługuje uruchamianie w emulatorze, debugowanie (na przykład punkty przerwania) nie działa.

Aby debugować role sieci Web i robocze, możesz ustawić projekt roli jako projekt startowy i debugować go zamiast nich. Można również ustawić wiele projektów startowych. Kliknij prawym przyciskiem myszy rozwiązanie, a następnie wybierz pozycję Ustaw projekty startowe.

Właściwości projektu rozwiązania startowego

Publikowanie na platformie Azure

Aby przeprowadzić publikowanie, kliknij prawym przyciskiem myszy projekt usługi w chmurze w rozwiązaniu, a następnie wybierz pozycję Publikuj.

Logowanie na potrzeby publikowania na platformie Microsoft Azure

Podążaj za kreatorem. Jeśli trzeba, włącz pulpit zdalny. Zdalny pulpit jest przydatny, gdy musisz coś zdebugować.

Po zakończeniu konfigurowania ustawień wybierz pozycję Publikuj.

W oknie danych wyjściowych zostanie wyświetlony postęp, a następnie zostanie wyświetlone okno Dziennik aktywności platformy Microsoft Azure.

Okno Dziennik aktywności platformy Microsoft Azure

Wdrożenie potrwa kilka minut, a następnie role sieciowe i/lub role pracownika będą działać w Azure.

Sprawdzanie dzienników

Po uruchomieniu maszyny wirtualnej usługi w chmurze i zainstalowaniu języka Python można sprawdzić dzienniki pod kątem komunikatów o błędach. Te dzienniki znajdują się w folderze C:\Resources\Directory\{role}\LogFiles . Plik PrepPython.err.txt zawiera co najmniej jeden błąd zwracany, gdy skrypt próbuje wykryć instalację środowiska Python, a plik PipInstaller.err.txt może zgłaszać błąd nieaktualnej wersji kodu pip.

Następne kroki

Bardziej szczegółowe informacje na temat pracy z rolami web i worker w narzędziach Python Tools for Visual Studio można znaleźć w dokumentacji PTVS.

Więcej szczegółów dotyczących korzystania z usług Azure na podstawie roli internetowej i roli procesu roboczego, na przykład używania usługi Azure Storage lub Service Bus, można znaleźć w artykułach wymienionych poniżej: