Partilhar via


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

Importante

Os Serviços na Nuvem (clássicos) foram preteridos para todos os clientes a partir de 1º de setembro de 2024. Todas as implantações em execução existentes serão interrompidas e encerradas pela Microsoft e os dados serão perdidos permanentemente a partir de outubro de 2024. Novas implantações devem usar o novo modelo de implantação baseado no Azure Resource Manager Serviços de Nuvem do Azure (suporte estendido).

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

Observação

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 de nuvem, uma função Web fornece um servidor Web dedicado dos Serviços de Informações da Internet (IIS) para hospedar aplicativos Web front-end. Uma função de trabalho pode executar tarefas assíncronas, de longa execução ou perpétuas, independentemente da interação ou entrada do usuário.

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

Observação

Pretende construir 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.

Janela de Serviço de Nuvem Azure

O modelo de função de trabalhador vem com código padrão para se ligar a uma conta de armazenamento do Azure ou ao 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. 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 web em Python implementada com o Django, com o Python ou com funções de trabalho em C#. Pode comunicar facilmente entre os seus papéis utilizando as filas do Service Bus ou as filas de armazenamento.

Instalar o Python no serviço em nuvem

Advertência

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 principal problema com os scripts de configuração é que eles não instalam 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 o pip para instalar quaisquer dependências que você possa ter.

Os scripts a seguir foram escritos visando Python 3.8. Se pretender utilizar a versão 2.x do Python, defina a variável PYTHON2 como ligado para as duas tarefas de arranque e a tarefa 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 do trabalhador. A variável PYPATH só é utilizada se a variável PYTHON2 estiver definida como 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>

Amostra de 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.

PrepPython.ps1

Este script instala 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, o Python 2.7 será usado, caso contrário, o Python 3.8 será usado.

$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 LaunchWorker.ps1

Observação

No caso de um projeto de uma função de trabalho, é preciso o ficheiro LauncherWorker.ps1 para executar o ficheiro de arranque. Em um projeto de função web, o ficheiro de arranque é definido nas propriedades do projeto.

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

Este script chama o arquivo worker.py do seu projeto Python. Se a variável de ambiente PYTHON2 estiver definida como ativada, o Python 2.7 será usado, caso contrário, o Python 3.8 será usado.

$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 provavelmente criaram um arquivo ps.cmd na pasta ./bin . Esse shell script chama os scripts de wrapper do PowerShell anteriores e fornece registro em log com base no nome do wrapper do PowerShell chamado. Se esse arquivo não fosse criado, o seguinte script estaria nele:

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

Embora o PTVS ofereça suporte à execuçã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.

Definições 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

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

Quando terminar de definir as configurações, escolha Publicar.

Algum progresso aparece na janela de saída e, em seguida, você vê a janela Log 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. Esses logs 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.

Próximos passos

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: