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

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

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 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 pip para instalar quaisquer dependências que possa ter.

Os scripts a seguir foram escritos visando 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, 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 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 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 à inicializaçã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

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: