Ruoli Web e ruoli di lavoro Python con Python Tools for Visual StudioPython web and worker roles with Python Tools for Visual Studio

Questo articolo offre una panoramica dell'uso dei ruoli Web e di lavoro Phyton con Python Tools for Visual Studio.This article provides an overview of using Python web and worker roles using Python Tools for Visual Studio. Informazioni su come usare Visual Studio per creare e distribuire un servizio cloud di base che usa Python.Learn how to use Visual Studio to create and deploy a basic Cloud Service that uses Python.

PrerequisitiPrerequisites

Nota

Per completare l'esercitazione, è necessario un account Azure.To complete this tutorial, you need an Azure account. È possibile attivare i vantaggi della sottoscrizione Visual Studio o iscriversi per una versione di valutazione gratuita.You can activate your Visual Studio subscriber benefits or sign up for a free trial.

Cosa sono i ruoli Web e di lavoro Python?What are Python web and worker roles?

Azure offre tre modelli di calcolo per l'esecuzione di applicazioni: funzionalità App Web in Servizio app di Azure, macchine virtuali di Azure e Servizi cloud di Azure.Azure provides three compute models for running applications: Web Apps feature in Azure App Service, Azure Virtual Machines, and Azure Cloud Services. Tutti e tre i modelli supportano Python.All three models support Python. Servizi cloud, che include ruoli Web e di lavoro, fornisce la tecnologia di piattaforma distribuita come servizio (PaaS).Cloud Services, which include web and worker roles, provide Platform as a Service (PaaS). Nell'ambito di un servizio cloud, un ruolo Web fornisce un server Web IIS (Internet Information Services) dedicato su cui ospitare applicazioni Web front-end, mentre un ruolo di lavoro consente di eseguire attività asincrone, a esecuzione prolungata o perpetue, indipendenti dall'interazione o dall'input degli utenti.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.

Per altre informazioni, vedere Informazioni sul servizio cloud.For more information, see [What is a Cloud Service?].

Nota

Come creare un semplice sito WebLooking to build a simple website? Se si intende creare un semplice sito Web front-end, è possibile usare la funzionalità App Web in Azure App Service.If your scenario involves just a simple website front end, consider using the lightweight Web Apps feature in Azure App Service. È possibile procedere all'aggiornamento a un servizio cloud con facilità, in base alla crescita del sito Web e all'insorgere di nuove esigenze.You can easily upgrade to a Cloud Service as your website grows and your requirements change. Per articoli che trattano lo sviluppo della funzionalità App Web in Servizio app di Azure, vedere il Centro per sviluppatori Python.See the Python Developer Center for articles that cover development of the Web Apps feature in Azure App Service.

Creazione del progettoProject creation

In Visual Studio è possibile selezionare Servizio Cloud Azure nella finestra di dialogo Nuovo progetto sotto Python.In Visual Studio, you can select Azure Cloud Service in the New Project dialog box, under Python.

Finestra di dialogo Nuovo progetto

Nella procedura guidata del servizio cloud di Azure è possibile creare nuovi ruoli Web e di lavoro.In the Azure Cloud Service wizard, you can create new web and worker roles.

Finestra di dialogo del servizio cloud di Azure

Nel modello di ruolo di lavoro è disponibile il codice boilerplate per connettersi a un bus di servizio o a un account di archiviazione di Azure.The worker role template comes with boilerplate code to connect to an Azure storage account or Azure Service Bus.

Soluzione del servizio cloud

È possibile aggiungere ruoli di lavoro o Web a un servizio cloud esistente in qualsiasi momento.You can add web or worker roles to an existing cloud service at any time. È possibile scegliere di aggiungere alla soluzione progetti esistenti oppure crearne uno nuovo.You can choose to add existing projects in your solution, or create new ones.

Comando per l'aggiunta di un ruolo

Il servizio cloud può contenere ruoli implementati in linguaggi diversi.Your cloud service can contain roles implemented in different languages. Ad esempio, è possibile avere un ruolo Web Python implementato usando Django, con ruoli di lavoro Python o C#.For example, you can have a Python web role implemented using Django, with Python, or with C# worker roles. È possibile mettere facilmente in comunicazione i ruoli con code di bus di servizio o code di archiviazione.You can easily communicate between your roles using Service Bus queues or storage queues.

Installare Python nel servizio cloudInstall Python on the cloud service

Avviso

Gli script di installazione installati con Visual Studio al momento dell'ultimo aggiornamento di questo articolo non funzionano.The setup scripts that are installed with Visual Studio (at the time this article was last updated) do not work. Questa sezione illustra una soluzione alternativa.This section describes a workaround.

Il problema principale con gli script di installazione è che non installano Python.The main problem with the setup scripts is that they do not install python. Definire prima due attività di avvio nel file ServiceDefinition.csdef.First, define two startup tasks in the ServiceDefinition.csdef file. La prima attività, PrepPython.ps1, scarica e installa il runtime di Python.The first task (PrepPython.ps1) downloads and installs the Python runtime. La seconda attività, PipInstaller.ps1, esegue pip per installare le eventuali dipendenze.The second task (PipInstaller.ps1) runs pip to install any dependencies you may have.

Gli script seguenti sono stati scritti per Python 3.5.The following scripts were written targeting Python 3.5. Per usare la versione 2.x di Python, impostare il file di variabile PYTHON2 su on per le due attività di avvio e l'attività di runtime: <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>

È necessario aggiungere le variabili PYTHON2 e PYPATH all'attività di avvio del ruolo di lavoro.The PYTHON2 and PYPATH variables must be added to the worker startup task. La variabile PYPATH viene usata solo se la variabile PYTHON2 è impostata su on.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>

File ServiceDefinition.csdef di esempioSample 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>

Creare ora i file PrepPython.ps1 e PipInstaller.ps1 nella cartella ./bin del ruolo.Next, create the PrepPython.ps1 and PipInstaller.ps1 files in the ./bin folder of your role.

PrepPython.ps1PrepPython.ps1

Questo script installa Python.This script installs python. Se la variabile di ambiente PYTHON2 è impostata su on, viene installato Python 2.7. In caso contrario, viene installato Python 3.5.If the PYTHON2 environment variable is set to on, then Python 2.7 is installed, otherwise Python 3.5 is installed.

$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

Questo script chiama pip e installa tutte le dipendenze presenti nel file requirements.txt.This script calls up pip and installs all of the dependencies in the requirements.txt file. Se la variabile di ambiente PYTHON2 è impostata su on, viene usato Python 2.7. In caso contrario, viene usato Python 3.5.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"
    }
}

Modificare LaunchWorker.ps1Modify LaunchWorker.ps1

Nota

Nel caso di un progetto ruolo di lavoro, è necessario il file LauncherWorker.ps1 per eseguire il file di avvio.In the case of a worker role project, LauncherWorker.ps1 file is required to execute the startup file. In un progetto ruolo Web il file di avvio viene invece definito nelle proprietà del progetto.In a web role project, the startup file is instead defined in the project properties.

Il file bin\LaunchWorker.ps1 è stato originariamente creato per eseguire molte attività preliminari, ma non funziona.The bin\LaunchWorker.ps1 was originally created to do a lot of prep work but it doesn't really work. Sostituire il contenuto del file con lo script seguente.Replace the contents in that file with the following script.

Questo script chiama il file worker.py dal progetto Python.This script calls the worker.py file from your python project. Se la variabile di ambiente PYTHON2 è impostata su on, viene usato Python 2.7. In caso contrario, viene usato Python 3.5.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

I modelli di Visual Studio dovrebbero aver creato un file ps.cmd nella cartella ./bin.The Visual Studio templates should have created a ps.cmd file in the ./bin folder. Questo script della shell chiama gli script del wrapper di PowerShell precedenti e fornisce la registrazione in base al nome del wrapper di PowerShell chiamato.This shell script calls out the PowerShell wrapper scripts above and provides logging based on the name of the PowerShell wrapper called. Se questo file non è stato creato, di seguito è indicato il contenuto necessario.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"

Esecuzione localeRun locally

Se si imposta il progetto servizio cloud come progetto di avvio e si preme F5, il servizio cloud viene eseguito nell'emulatore locale di Azure.If you set your cloud service project as the startup project and press F5, the cloud service runs in the local Azure emulator.

Anche se PTVS supporta l'avvio nell'emulatore, il debug (ad esempio, punti di interruzione) non funziona.Although PTVS supports launching in the emulator, debugging (for example, breakpoints) does not work.

Per eseguire il debug dei ruoli di lavoro e Web, è possibile impostare il progetto di ruolo come progetto di avvio e ed eseguirne il debug.To debug your web and worker roles, you can set the role project as the startup project and debug that instead. È anche possibile impostare più progetti di avvio.You can also set multiple startup projects. Fare clic con il pulsante destro del mouse sulla soluzione e scegliere Imposta progetti di avvio.Right-click the solution and then select Set StartUp Projects.

Proprietà del progetto di avvio della soluzione

Pubblicazione in AzurePublish to Azure

Per pubblicare, fare clic con il pulsante destro del mouse sul progetto servizio cloud nella soluzione e quindi scegliere Pubblica.To publish, right-click the cloud service project in the solution and then select Publish.

Accesso per la pubblicazione di Microsoft Azure

Seguire la procedura guidata.Follow the wizard. Se necessario, abilitare Desktop remoto.If you need to, enable remote desktop. Desktop remoto è utile quando è necessario eseguire il debug di un elemento.Remote desktop is helpful when you need to debug something.

Dopo aver finito di configurare le impostazioni, fare clic su Pubblica.When you are done configuring settings, click Publish.

Nella finestra di output vengono visualizzati alcuni stati, quindi apparirà la finestra Log attività di Microsoft Azure.Some progress appears in the output window, then you'll see the Microsoft Azure Activity Log window.

Finestra Log attività di Microsoft Azure

Sono necessari alcuni minuti per completare la distribuzione, quindi i ruoli di lavoro e/o Web vengono eseguiti in Azure.Deployment takes several minutes to complete, then your web and/or worker roles run on Azure!

Esaminare i logInvestigate logs

Dopo che la macchina virtuale del servizio cloud è stata avviata e ha installato Python, è possibile esaminare i log per trovare eventuali messaggi di errore.After the cloud service virtual machine starts up and installs Python, you can look at the logs to find any failure messages. Questi log si trovano nella cartella C:\Resources\Directory\{role}\LogFiles.These logs are located in the C:\Resources\Directory\{role}\LogFiles folder. PrepPython.err.txt contiene almeno un errore relativo al tentativo dello script di verificare se Python è installato e PipInstaller.err.txt può segnalare una versione obsoleta di 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.

Passaggi successiviNext steps

Per informazioni più dettagliate sull'uso di ruoli di lavoro e Web in Python Tools per Visual Studio, vedere la documentazione PTVS:For more detailed information about working with web and worker roles in Python Tools for Visual Studio, see the PTVS documentation:

Per altre informazioni dettagliate sull'uso di servizi di Azure dai ruoli di lavoro e Web, ad esempio sull'uso dell'archiviazione o del bus di servizio di Azure, vedere gli articoli seguenti: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: