Funções da Web e de trabalho do Python com Ferramentas de Python para Visual Studio

Importante

Serviços Cloud (clássico) é agora preterido para novos clientes e será descontinuado a 31 de agosto de 2024 para todos os clientes. As novas implementações devem utilizar o novo modelo de implementação baseado em Resource Manager do Azure Serviços Cloud (suporte alargado).

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. Aprenda a utilizar o Visual Studio para criar e implementar um Serviço Cloud básico que utiliza o Python.

Pré-requisitos

Nota

Para concluir este tutorial, precisa de uma conta do Azure. Pode ativar os benefícios de subscritor do Visual Studio ou inscrever-se numa avaliação gratuita.

O que são as funções da Web e de trabalho do Python?

O Azure fornece três modelos de computação para a execução de aplicações: Funcionalidade Aplicações Web no Serviço de Aplicações do Azure, Máquinas Virtuais do Azure e Serviços Cloud do Azure. Os três modelos suportam o Python. Os Cloud Services, que incluem funções da Web e de trabalho, fornecem uma Plataforma como Serviço (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.

Para obter mais informações, consulte O que é um Serviço em Nuvem?.

Nota

Pretende compilar um site simples? 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. Pode facilmente atualizar para uma Serviço em Nuvem à medida que o Web site cresce e os seus requisitos se alteram. Consulte os artigos do Centro para Programadores do Python relativos ao desenvolvimento da funcionalidade Web Apps no App Service do Azure.

Criação do projeto

No Visual Studio, pode selecionar Serviço em Nuvem do Azure na caixa de diálogo Novo Projeto, em 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.

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.

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. Pode optar por adicionar projetos existentes na sua solução ou criar novos.

Adicionar Comando de Função

O serviço em nuvem pode conter funções implementadas em diferentes idiomas. 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#. Pode comunicar facilmente entre as funções de utilizar as filas do Service Bus ou as filas de armazenamento.

Instalar o Python no serviço em nuvem

Aviso

Os scripts de configuração instalados com o Visual Studio (aquando da última atualização deste artigo) não funcionam. Esta secção descreve uma solução.

O problema principal com os scripts de configuração é o facto de não instalarem o python. Em primeiro lugar, defina duas tarefas de arranque no ficheiro ServiceDefinition.csdef. A primeira tarefa (PrepPython.ps1) transfere e instala o tempo de execução do Python. A segunda tarefa (PipInstaller.ps1) é executa pip para instalar quaisquer dependências que possa ter.

Os scripts seguintes foram escritos com o nome Python 3.8. 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>" />.

<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. A variável PYPATH só é utilizada se a variável PYTHON2 estiver definida como Ligado.

<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 amostra

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

PrepPython.ps1

Este script instala o Python. Se a variável de ambiente PYTHON2 estiver definida como ativada, o Python 2.7 será instalado, caso contrário, o Python 3.8 será instalado.

[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

Este script chama o pip e instala todas as dependências no ficheiro requirements.txt. Se a variável de ambiente PYTHON2 estiver definida como ativada, será utilizado o Python 2.7, caso contrário, é utilizado o 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"
    }
}

Modificar o 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. Num projeto função da Web, o ficheiro de arranque é definido nas propriedades do projeto.

O bin\LaunchWorker.ps1 foi criado originalmente para muito trabalho de preparação, mas realmente não funciona. Substitua o conteúdo nesse ficheiro pelo seguinte script.

Este script chama o ficheiro worker.py do seu projeto Python. Se a variável de ambiente PYTHON2 estiver definida como ativada, será utilizado o Python 2.7, caso contrário, é utilizado o 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

Os modelos do Visual Studio criam um ficheiro ps.cmd na pasta ./bin. 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. Se este ficheiro não foi criado, eis o que deve aparecer no mesmo.

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

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.

Apesar de o PTVS suportar a iniciação no emulador, a depuração (por exemplo, pontos de interrupção) não funciona.

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. Também pode definir vários projetos de arranque. Clique com o botão direito do rato na solução e, em seguida, selecione Definir Projetos de Arranque.

Propriedades do Projeto de Arranque da Solução

Publicar no 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.

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

Inicie o assistente. Se for necessário, ative o ambiente de trabalho remoto. O ambiente de trabalho remoto é útil quando necessita de depurar algo.

Quando tiver concluído a configuração de definições, clique em Publicar.

É apresentado algum progresso na janela de resultados e, em seguida, verá a janela de Registo de Atividades do Microsoft Azure.

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!

Investigar registos

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. Estes registos estão localizados na pasta C:\Resources\Directory\{role}\LogFiles . 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.

Passos seguintes

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:

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: