Python-Web- und -Workerrollen mit Python-Tools für Visual StudioPython web and worker roles with Python Tools for Visual Studio

Dieser Artikel enthält eine Übersicht über die Verwendung von Python-Web- und -Workerrollen mit Python-Tools für Visual Studio.This article provides an overview of using Python web and worker roles using Python Tools for Visual Studio. Sie erfahren, wie Sie mit Visual Studio einen einfachen Clouddienst, für den Python verwendet wird, erstellen und bereitstellen.Learn how to use Visual Studio to create and deploy a basic Cloud Service that uses Python.

VoraussetzungenPrerequisites

Hinweis

Um dieses Tutorial abzuschließen, benötigen Sie ein Azure-Konto.To complete this tutorial, you need an Azure account. Sie können Ihre Visual Studio-Abonnentenvorteile aktivieren oder sich für eine kostenlose Testversion anmelden.You can activate your Visual Studio subscriber benefits or sign up for a free trial.

Was sind Python-Web- und Workerrollen?What are Python web and worker roles?

Azure stellt drei Computemodelle bereit, die Sie zum Ausführen von Anwendungen verwenden können: Web-Apps-Feature in Azure App Service, Azure Virtual Machines und Azure Cloud Services.Azure provides three compute models for running applications: Web Apps feature in Azure App Service, Azure Virtual Machines, and Azure Cloud Services. Alle drei Modelle unterstützen Python.All three models support Python. Cloud Services, die auch Web- und Workerrollen umfassen, ermöglichen Platform as a Service (PaaS) .Cloud Services, which include web and worker roles, provide Platform as a Service (PaaS). In einem Clouddienst bietet eine Webrolle einen speziellen IIS-Webserver (Internet Information Services), um Front-End-Webanwendungen zu hosten, während eine Workerrolle asynchrone, langfristige oder fortwährende Aufgaben ausführen kann, die unabhängig von einer Benutzerinteraktion oder -eingabe sind.Within a cloud service, a web role provides a dedicated Internet Information Services (IIS) web server to host front end web applications, while a worker role can run asynchronous, long-running, or perpetual tasks independent of user interaction or input.

Weitere Informationen finden Sie unter Was ist ein Clouddienst?.For more information, see What is a Cloud Service?.

Hinweis

Möchten Sie eine einfache Website erstellen?Looking to build a simple website? Wenn Ihr Szenario nur ein einfaches Website-Front-End umfasst, sollten Sie die Verwendung des einfachen Web-Apps-Features von Azure App Service in Betracht ziehen.If your scenario involves just a simple website front end, consider using the lightweight Web Apps feature in Azure App Service. Sie können einen Cloud-Dienst leicht upgraden, wenn die Website größer wird und sich Ihre Anforderungen ändern.You can easily upgrade to a Cloud Service as your website grows and your requirements change. Im Python Developer Center finden Sie Artikel zur Entwicklung des Web-Apps-Features von Azure App Service.See the Python Developer Center for articles that cover development of the Web Apps feature in Azure App Service.

ProjekterstellungProject creation

In Visual Studio können Sie im Dialogfeld Neues Projekt unter Python die Option Azure Cloud Service auswählen.In Visual Studio, you can select Azure Cloud Service in the New Project dialog box, under Python.

Dialogfeld "Neues Projekt"

Im Assistenten für Azure-Clouddienste können Sie neue Web- und Workerrollen erstellen.In the Azure Cloud Service wizard, you can create new web and worker roles.

Dialogfeld "Azure Cloud Service"

Die Workerrollenvorlage enthält Codebausteine für eine Verbindung mit einem Azure-Speicherkonto oder Azure Service Bus.The worker role template comes with boilerplate code to connect to an Azure storage account or Azure Service Bus.

Cloud-Dienstlösung

Sie können Web- oder Workerrollen jederzeit zu einem vorhandenen Cloud-Dienst hinzufügen.You can add web or worker roles to an existing cloud service at any time. Sie können vorhandene Projekte zu Ihrer Lösung hinzufügen oder neue erstellen.You can choose to add existing projects in your solution, or create new ones.

Befehl "Rolle hinzufügen"

Ihr Cloud-Dienst kann Rollen enthalten, die in verschiedenen Sprachen implementiert wurden.Your cloud service can contain roles implemented in different languages. Sie können beispielsweise eine Python-Webrolle mithilfe von Django in Python- oder C#-Workerrollen implementieren.For example, you can have a Python web role implemented using Django, with Python, or with C# worker roles. Sie können mit Service Bus-Warteschlangen oder Speicherwarteschlangen einfach zwischen Ihren Rollen kommunizieren.You can easily communicate between your roles using Service Bus queues or storage queues.

Installieren von Python im ClouddienstInstall Python on the cloud service

Warnung

Die mit Visual Studio installierten Setupskripts funktionieren nicht (zum Zeitpunkt der letzten Aktualisierung dieses Artikels).The setup scripts that are installed with Visual Studio (at the time this article was last updated) do not work. In diesem Abschnitt wird eine Problemumgehung beschrieben.This section describes a workaround.

Das Hauptproblem der Setupskripts ist, dass Python nicht installiert wird.The main problem with the setup scripts is that they do not install python. Definieren Sie zuerst zwei Startaufgaben in der Datei ServiceDefinition.csdef.First, define two startup tasks in the ServiceDefinition.csdef file. Mit der ersten Aufgabe (PrepPython.ps1) wird die Python-Laufzeit heruntergeladen und installiert.The first task (PrepPython.ps1) downloads and installs the Python runtime. Mit der zweiten Aufgabe (PipInstaller.ps1) wird PIP ausgeführt, um alle ggf. vorhandenen Abhängigkeiten zu installieren.The second task (PipInstaller.ps1) runs pip to install any dependencies you may have.

Die folgenden Skripts wurden für Python 3.5 geschrieben.The following scripts were written targeting Python 3.5. Falls Sie Version 2.x von Python verwenden möchten, können Sie die Variable PYTHON2 für die beiden Startaufgaben und die Laufzeitaufgabe auf on festlegen: <Variable name="PYTHON2" value="<mark>on</mark>" />.If you want to use the version 2.x of python, set the PYTHON2 variable file to on for the two startup tasks and the runtime task: <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>

Die Variablen PYTHON2 und PYPATH müssen der Workerstartaufgabe hinzugefügt werden.The PYTHON2 and PYPATH variables must be added to the worker startup task. Die Variable PYPATH wird nur verwendet, wenn die Variable PYTHON2 auf on festgelegt ist.The PYPATH variable is only used if the PYTHON2 variable is set to 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>

Beispieldatei „ServiceDefinition.csdef“Sample 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>

Erstellen Sie als Nächstes die Dateien PrepPython.ps1 und PipInstaller.ps1 im Ordner ./bin Ihrer Rolle.Next, create the PrepPython.ps1 and PipInstaller.ps1 files in the ./bin folder of your role.

PrepPython.ps1PrepPython.ps1

Mit diesem Skript wird Python installiert.This script installs python. Wenn die Umgebungsvariable PYTHON2 auf on festgelegt ist, wird Python 2.7 installiert. Andernfalls wird Python 3.5 installiert.If the PYTHON2 environment variable is set to on, then Python 2.7 is installed, otherwise Python 3.5 is installed.

[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.5.2/python-3.5.2-amd64.exe"
        $outFile = "${env:TEMP}\python-3.5.2-amd64.exe"

        if ($is_python2) {
            $url = "https://www.python.org/ftp/python/2.7.12/python-2.7.12.amd64.msi"
            $outFile = "${env:TEMP}\python-2.7.12.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.ps1PipInstaller.ps1

Mit diesem Skript wird PIP aufgerufen, und alle Abhängigkeiten in der Datei requirements.txt werden installiert.This script calls up pip and installs all of the dependencies in the requirements.txt file. Wenn die Umgebungsvariable PYTHON2 auf on festgelegt ist, wird Python 2.7 verwendet. Andernfalls wird Python 3.5 verwendet.If the PYTHON2 environment variable is set to on, then Python 2.7 is used, otherwise Python 3.5 is used.

$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"
    }
}

Ändern von „LaunchWorker.ps1“Modify LaunchWorker.ps1

Hinweis

Im Fall eines Workerrollenprojekts ist zum Ausführen der Startdatei die Datei LauncherWorker.ps1 erforderlich.In the case of a worker role project, LauncherWorker.ps1 file is required to execute the startup file. In einem Webrollenprojekt wird stattdessen die Startdatei in den Projekteigenschaften festgelegt.In a web role project, the startup file is instead defined in the project properties.

bin\LaunchWorker.ps1 wurde ursprünglich erstellt, um eine Reihe von Vorbereitungsschritten auszuführen, aber dies funktioniert nicht wie gewünscht.The bin\LaunchWorker.ps1 was originally created to do a lot of prep work but it doesn't really work. Ersetzen Sie den Inhalt dieser Datei durch das folgende Skript.Replace the contents in that file with the following script.

Mit dem Skript wird die Datei worker.py aus Ihrem Python-Projekt aufgerufen.This script calls the worker.py file from your python project. Wenn die Umgebungsvariable PYTHON2 auf on festgelegt ist, wird Python 2.7 verwendet. Andernfalls wird Python 3.5 verwendet.If the PYTHON2 environment variable is set to on, then Python 2.7 is used, otherwise Python 3.5 is used.

$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.cmdps.cmd

Von den Visual Studio-Vorlagen sollte im Ordner ./bin die Datei ps.cmd erstellt worden sein.The Visual Studio templates should have created a ps.cmd file in the ./bin folder. Mit diesem Shellskript werden die obigen PowerShell-Wrapperskripts verwendet, und die Anmeldung ist basierend auf dem Namen des aufgerufenen PowerShell-Wrappers möglich.This shell script calls out the PowerShell wrapper scripts above and provides logging based on the name of the PowerShell wrapper called. Hier ist der Inhalt der Datei angegeben, falls sie nicht erstellt wurde.If this file wasn't created, here is what should be in it.

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

Lokales AusführenRun locally

Wenn Sie Ihr Clouddienstprojekt als Startprojekt festlegen und F5 drücken, wird der Clouddienst im lokalen Azure-Emulator ausgeführt.If you set your cloud service project as the startup project and press F5, the cloud service runs in the local Azure emulator.

Auch wenn PTVS den Start im Emulator unterstützt, funktioniert das Debuggen (etwa Haltepunkte) nicht.Although PTVS supports launching in the emulator, debugging (for example, breakpoints) does not work.

Um Web- und Workerrollen zu debuggen, können Sie das Rollenprojekt als Startprojekt festlegen und dieses stattdessen debuggen.To debug your web and worker roles, you can set the role project as the startup project and debug that instead. Sie können auch mehrere Startprojekte festlegen.You can also set multiple startup projects. Klicken Sie mit der rechten Maustaste auf die Lösung, und wählen Sie Startprojekte festlegen aus.Right-click the solution and then select Set StartUp Projects.

Startprojekteigenschaften der Lösung

Veröffentlichen in AzurePublish to Azure

Klicken Sie für die Veröffentlichung mit der rechten Maustaste auf das Clouddienstprojekt in der Lösung, und wählen Sie Veröffentlichen aus.To publish, right-click the cloud service project in the solution and then select Publish.

Anmeldung für Microsoft Azure-Veröffentlichung

Führen Sie die Schritte des Assistenten aus.Follow the wizard. Aktivieren Sie den Remotedesktop, wenn dies erforderlich ist.If you need to, enable remote desktop. Der Remotedesktop ist hilfreich für das Debuggen.Remote desktop is helpful when you need to debug something.

Klicken Sie auf Veröffentlichen, wenn Sie mit den Konfigurationseinstellungen fertig sind.When you are done configuring settings, click Publish.

Der Fortschritt wird im Ausgabefenster angezeigt, anschließend wird das Fenster mit dem Microsoft Azure-Aktivitätsprotokoll angezeigt.Some progress appears in the output window, then you'll see the Microsoft Azure Activity Log window.

Fenster mit Microsoft Azure-Aktivitätsprotokoll

Der Abschluss der Bereitstellung dauert einige Minuten, anschließend werden Ihre Web- und/oder Workerrollen in Azure ausgeführt.Deployment takes several minutes to complete, then your web and/or worker roles run on Azure!

Untersuchen von ProtokollenInvestigate logs

Nachdem der virtuelle Computer des Clouddiensts gestartet und Python installiert wurde, können Sie in den Protokollen nach Fehlermeldungen suchen.After the cloud service virtual machine starts up and installs Python, you can look at the logs to find any failure messages. Diese Protokolle befinden sich im Ordner C:\Resources\Directory\{role}\LogFiles.These logs are located in the C:\Resources\Directory\{role}\LogFiles folder. PrepPython.err.txt enthält mindestens einen Fehler, da vom Skript überprüft wird, ob Python installiert ist, und PipInstaller.err.txt meldet unter Umständen eine veraltete Version von PIP.PrepPython.err.txt has at least one error in it from when the script tries to detect if Python is installed and PipInstaller.err.txt may complain about an outdated version of pip.

Nächste SchritteNext steps

Genauere Informationen zur Arbeit mit Web- und Workerrollen in Python-Tools für Visual Studio finden Sie in der PTVS-Dokumentation:For more detailed information about working with web and worker roles in Python Tools for Visual Studio, see the PTVS documentation:

Weitere Details zur Verwendung von Azure-Diensten aus Ihren Web- und Workerrollen, etwa zur Verwendung von Azure Storage oder Azure Service Bus, finden Sie in folgenden Artikeln:For more details about using Azure services from your web and worker roles, such as using Azure Storage or Service Bus, see the following articles: