Funções da Web e de trabalho do Python com Ferramentas de Python para Visual StudioPython web and worker roles with Python Tools for Visual Studio

Este artigo fornece uma descrição geral da utilização de funções da Web e de trabalho do Python através das Ferramentas do Python para Visual Studio.This article provides an overview of using Python web and worker roles using Python Tools for Visual Studio. Aprenda a utilizar o Visual Studio para criar e implementar um Serviço Cloud básico que utiliza o Python.Learn how to use Visual Studio to create and deploy a basic Cloud Service that uses Python.

Pré-requisitosPrerequisites

Nota

Para concluir este tutorial, precisa de uma conta do Azure.To complete this tutorial, you need an Azure account. Pode ativar os benefícios de subscritor do Visual Studio ou inscrever-se numa avaliação gratuita.You can activate your Visual Studio subscriber benefits or sign up for a free trial.

O que são as funções da Web e de trabalho do Python?What are Python web and worker roles?

O Azure fornece três modelos de computação para a execução de aplicativos: recurso de aplicativos Web no serviço de Azure app, máquinas virtuais do Azuree serviços de nuvem do Azure.Azure provides three compute models for running applications: Web Apps feature in Azure App Service, Azure Virtual Machines, and Azure Cloud Services. Os três modelos suportam o Python.All three models support Python. Os Cloud Services, que incluem funções da Web e de trabalho, fornecem uma Plataforma como Serviço (PaaS) .Cloud Services, which include web and worker roles, provide Platform as a Service (PaaS). Dentro de um serviço cloud, uma função da Web fornece um servidor Web de Serviços de Informação Internet (IIS) dedicado para alojar as aplicações Web front-end, enquanto uma função de trabalho pode executar tarefas assíncronas, de execução longa ou perpétuas, independentes da interação ou intervenção do utilizador.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.

Para obter mais informações, consulte O que é um Serviço em Nuvem?.For more information, see What is a Cloud Service?.

Nota

Pretende compilar um site simples?Looking to build a simple website? Se o seu cenário envolver apenas um front-end de um site simples, considere utilizar a funcionalidade Aplicações Web simples do Serviço de Aplicações do Azure.If your scenario involves just a simple website front end, consider using the lightweight Web Apps feature in Azure App Service. Pode facilmente atualizar para uma Serviço em Nuvem à medida que o Web site cresce e os seus requisitos se alteram.You can easily upgrade to a Cloud Service as your website grows and your requirements change. Consulte os artigos do Centro para Programadores do Python relativos ao desenvolvimento da funcionalidade Web Apps no App Service do Azure.See the Python Developer Center for articles that cover development of the Web Apps feature in Azure App Service.

Criação do projetoProject creation

No Visual Studio, pode selecionar Serviço em Nuvem do Azure na caixa de diálogo Novo Projeto, em Python.In Visual Studio, you can select Azure Cloud Service in the New Project dialog box, under Python.

Caixa de Diálogo Novo Projeto

No assistente do Serviço em Nuvem do Azure, pode criar novas funções da Web e de trabalho.In the Azure Cloud Service wizard, you can create new web and worker roles.

Caixa de Diálogo Serviço em Nuvem do Azure.

O modelo de função de trabalho é fornecido com o código automático de ligação a uma conta de armazenamento do Azure ou ao Service Bus do Azure.The worker role template comes with boilerplate code to connect to an Azure storage account or Azure Service Bus.

Solução de Serviço em Nuvem

Pode adicionar funções da Web ou de trabalho a um serviço em nuvem existente em qualquer altura.You can add web or worker roles to an existing cloud service at any time. Pode optar por adicionar projetos existentes na sua solução ou criar novos.You can choose to add existing projects in your solution, or create new ones.

Adicionar Comando de Função

O serviço em nuvem pode conter funções implementadas em diferentes idiomas.Your cloud service can contain roles implemented in different languages. Por exemplo, pode ter uma função da Web do Python implementada utilizando Django, com o Python ou com funções de trabalho do C#.For example, you can have a Python web role implemented using Django, with Python, or with C# worker roles. Pode comunicar facilmente entre as funções de utilizar as filas do Service Bus ou as filas de armazenamento.You can easily communicate between your roles using Service Bus queues or storage queues.

Instalar o Python no serviço em nuvemInstall Python on the cloud service

Aviso

Os scripts de configuração instalados com o Visual Studio (aquando da última atualização deste artigo) não funcionam.The setup scripts that are installed with Visual Studio (at the time this article was last updated) do not work. Esta secção descreve uma solução.This section describes a workaround.

O problema principal com os scripts de configuração é o facto de não instalarem o python.The main problem with the setup scripts is that they do not install python. Em primeiro lugar, defina duas tarefas de arranque no ficheiro ServiceDefinition.csdef.First, define two startup tasks in the ServiceDefinition.csdef file. A primeira tarefa (PrepPython.ps1) transfere e instala o tempo de execução do Python.The first task (PrepPython.ps1) downloads and installs the Python runtime. A segunda tarefa (PipInstaller.ps1) é executa pip para instalar quaisquer dependências que possa ter.The second task (PipInstaller.ps1) runs pip to install any dependencies you may have.

Os scripts seguintes foram escritos para o Python 3.5.The following scripts were written targeting Python 3.5. Se pretender utilizar a versão Client 2. x do Python, defina o ficheiro variável PYTHON2 como Ligado para as duas tarefas de arranque e a tarefa de tempo de execução: <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>

As variáveis PYTHON2 e PYPATH têm de ser adicionadas à tarefa de arranque da função de trabalho.The PYTHON2 and PYPATH variables must be added to the worker startup task. A variável PYPATH só é utilizada se a variável PYTHON2 estiver definida como Ligado.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>

ServiceDefinition.csdef de amostraSample 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>

Em seguida, crie os ficheiros PrepPython.ps1 e PipInstaller.ps1 na pasta . /bin da sua função.Next, create the PrepPython.ps1 and PipInstaller.ps1 files in the ./bin folder of your role.

PrepPython.ps1PrepPython.ps1

Este script instala o Python.This script installs python. Se a variável do ambiente PYTHON2 estiver definida como ligado, o Python 2.7 é instalado; caso contrário, é instalado o Python 3.5.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

Este script chama o pip e instala todas as dependências no ficheiro requirements.txt.This script calls up pip and installs all of the dependencies in the requirements.txt file. Se a variável do ambiente PYTHON2 estiver definida como ligado, o Python 2.7 é utilizado; caso contrário, é utilizado o 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"
    }
}

Modificar o LaunchWorker.ps1Modify LaunchWorker.ps1

Nota

No caso de um projeto de uma função de trabalho, é preciso o ficheiro LauncherWorker.ps1 para executar o ficheiro de arranque.In the case of a worker role project, LauncherWorker.ps1 file is required to execute the startup file. Num projeto função da Web, o ficheiro de arranque é definido nas propriedades do projeto.In a web role project, the startup file is instead defined in the project properties.

O bin\LaunchWorker.ps1 foi criado originalmente para muito trabalho de preparação, mas realmente não funciona.The bin\LaunchWorker.ps1 was originally created to do a lot of prep work but it doesn't really work. Substitua o conteúdo nesse ficheiro pelo seguinte script.Replace the contents in that file with the following script.

Este script chama o ficheiro worker.py a partir do seu projeto de Python.This script calls the worker.py file from your python project. Se a variável do ambiente PYTHON2 estiver definida como ligado, o Python 2.7 é utilizado; caso contrário, é utilizado o 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

Os modelos do Visual Studio criam um ficheiro ps.cmd na pasta ./bin.The Visual Studio templates should have created a ps.cmd file in the ./bin folder. Este script de shell chama os scripts de wrapper do PowerShell acima e fornece o registo com base no nome do wrapper de PowerShell chamado.This shell script calls out the PowerShell wrapper scripts above and provides logging based on the name of the PowerShell wrapper called. Se este ficheiro não foi criado, eis o que deve aparecer no mesmo.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"

Executar localmenteRun locally

Se definir o seu projeto de serviço cloud como o projeto de arranque e premir F5, o serviço cloud é executado no emulador local do Azure.If you set your cloud service project as the startup project and press F5, the cloud service runs in the local Azure emulator.

Apesar de o PTVS suportar a iniciação no emulador, a depuração (por exemplo, pontos de interrupção) não funciona.Although PTVS supports launching in the emulator, debugging (for example, breakpoints) does not work.

Para depurar as suas funções da Web e de trabalho, pode optar por definir o projeto de função como o projeto de arranque e efetuar a depuração.To debug your web and worker roles, you can set the role project as the startup project and debug that instead. Também pode definir vários projetos de arranque.You can also set multiple startup projects. Clique com o botão direito do rato na solução e, em seguida, selecione Definir Projetos de Arranque.Right-click the solution and then select Set StartUp Projects.

Propriedades do Projeto de Arranque da Solução

Publicar no AzurePublish to Azure

Para publicar, clique com o botão direito do rato no projeto do serviço em nuvem na solução e, em seguida, selecione Publicar.To publish, right-click the cloud service project in the solution and then select Publish.

Início de Sessão de Publicação do Microsoft Azure

Inicie o assistente.Follow the wizard. Se for necessário, ative o ambiente de trabalho remoto.If you need to, enable remote desktop. O ambiente de trabalho remoto é útil quando necessita de depurar algo.Remote desktop is helpful when you need to debug something.

Quando tiver concluído a configuração de definições, clique em Publicar.When you are done configuring settings, click Publish.

É apresentado algum progresso na janela de resultados e, em seguida, verá a janela de Registo de Atividades do Microsoft Azure.Some progress appears in the output window, then you'll see the Microsoft Azure Activity Log window.

Janela de Registo de Atividades do Microsoft Azure

A implementação demora alguns minutos a ser concluída. Em seguida, as funções da Web e de trabalho são executadas no Azure!Deployment takes several minutes to complete, then your web and/or worker roles run on Azure!

Investigar registosInvestigate logs

Depois de a máquina virtual do serviço de nuvem arrancar e instalar o Python, pode procurar nos registos para localizar todas as mensagens de falha.After the cloud service virtual machine starts up and installs Python, you can look at the logs to find any failure messages. Estes registos estão localizados na pasta C:\Resources\Directory\{role}\LogFiles.These logs are located in the C:\Resources\Directory\{role}\LogFiles folder. PrepPython.err.txt tem, pelo menos, um erro quando o script tenta detetar se o Python está instalado e o PipInstaller.err.txt pode queixar-se de uma versão desatualizada do 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.

Passos seguintesNext steps

Para obter informações mais detalhadas sobre como trabalhar com funções da Web e de trabalho nas Ferramentas do Python para Visual Studio, consulte a documentação das PTVS:For more detailed information about working with web and worker roles in Python Tools for Visual Studio, see the PTVS documentation:

Para obter mais detalhes sobre a utilização de serviços do Azure a partir das suas funções da Web e de trabalho, tais como utilizar o Armazenamento do Azure ou o Service Bus, consulte os seguintes artigos: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: