Rôles Web et rôles de travail Python avec Python Tools pour Visual Studio

Important

Services Cloud (classique) est désormais déconseillé pour les nouveaux clients et sera supprimé le 31 août 2024 pour tous les clients. Les nouveaux déploiements doivent utiliser le nouveau modèle de déploiement basé sur Azure Resource Manager Azure Cloud Services (support étendu) .

Cet article fournit une vue d’ensemble de l’utilisation des rôles Web et de travail Python avec Python Tools pour Visual Studio. Apprenez à utiliser Visual Studio pour créer et déployer un service cloud de base utilisant Python.

Prérequis

Notes

Pour suivre ce tutoriel, vous avez besoin d’un compte Azure. Vous pouvez activer les avantages de votre abonnement Visual Studio ou vous inscrire pour une version d’évaluation gratuite.

Présentation des rôles web et de travail Python

Azure propose trois modèles de calcul pour l’exécution d’applications : fonctionnalité Web Apps dans Azure App Service, Machines Virtuelles Azure et Azure Cloud Services. Ils prennent tous les trois en charge Python. Azure Cloud Services, qui inclut les rôles Web et de travail, fournit la fonctionnalité PaaS (Platform as a Service). Au sein d'un service cloud, un rôle web fournit un serveur web IIS (Internet Information Services) dédié permettant d'héberger des applications web frontales, tandis qu'un rôle de travail peut exécuter des tâches asynchrones, de longue durée ou perpétuelles indépendamment de l’interaction ou de la saisie de l’utilisateur.

Pour en savoir plus, voir Présentation d’un service Cloud.

Notes

Vous voulez créer un simple site Web ? Si votre scénario ne comporte qu'un simple composant frontal web, envisagez d'utiliser la fonctionnalité Web Apps légère dans Azure App Service. Vous pouvez facilement passer à un service cloud en fonction de l'évolution de votre site et de vos besoins. Consultez le Centre de développement Python pour découvrir des articles consacrés au développement de la fonctionnalité Web Apps dans Azure App Service.

Création du projet

Dans Visual Studio, vous pouvez sélectionner Azure Cloud Service dans la boîte de dialogue Nouveau projet, sous Python.

Boîte de dialogue Nouveau projet

Dans l'Assistant Service Cloud Azure, vous pouvez créer les rôles web et de travail.

Azure Cloud Service Dialog

Le modèle de rôle de travail est fourni avec un code réutilisable permettant de se connecter à un compte de stockage Azure ou à Azure Service Bus.

Cloud Service Solution

Vous pouvez ajouter des rôles web ou des rôles de travail quand vous le souhaitez à un service cloud existant. Vous pouvez choisir d'ajouter des projets existants à votre solution ou bien d'en créer de nouveaux.

Add Role Command

Votre service cloud peut contenir des rôles dans différents langages. Par exemple, vous pouvez avoir un rôle web Python implémenté à l'aide de Django, avec des rôles de travail Python ou C#. Vous pouvez assurer la communication entre les rôles grâce aux files d'attente Service Bus ou aux files d'attente de stockage.

Installer Python sur le service cloud

Avertissement

Au moment de la dernière mise à jour de cet article, les scripts d’installation qui sont installés avec Visual Studio ne fonctionnaient pas. Cette section décrit comment contourner le problème.

Le principal problème inhérent aux scripts d’installation réside dans le fait qu’ils n’installent pas Python. Commencez par définir deux tâches de démarrage dans le fichier ServiceDefinition.csdef. La première tâche (PrepPython.ps1) télécharge et installe le runtime Python. La seconde tâche (PipInstaller.ps1) exécute les paramètres d’initialisation de programme (pip) pour installer toutes vos dépendances éventuelles.

Les scripts ci-après ont été écrits pour Python 3.8. Si vous souhaitez utiliser la version 2.x de Python, définissez le fichier de variables PYTHON2 sur on pour les deux tâches de démarrage et la tâche d’exécution : <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>

Les variables PYTHON2 et PYPATH doivent être ajoutées à la tâche de démarrage du rôle de travail. La variable PYPATH est uniquement utilisée si la variable PYTHON2 est définie sur 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>

Exemple de fichier 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>

Ensuite, créez les fichiers PrepPython.ps1 et PipInstaller.ps1 dans le dossier ./bin de votre rôle.

PrepPython.ps1

Ce script installe Python. Si la variable d'environnement PYTHON2 est définie sur on, Python 2.7 est installé. Dans le cas contraire, le script installé est Python 3.8.

[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

Ce script appelle les paramètres d’initialisation de programme et installe toutes les dépendances dans le fichier requirements.txt. Si la variable d'environnement PYTHON2 est définie sur on, Python 2.7 est installé. Dans le cas contraire, le script installé est 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"
    }
}

Modifier LaunchWorker.ps1

Notes

Dans le cas d’un projet de rôle de travail, le fichier LauncherWorker.ps1 est requis pour exécuter le fichier de démarrage. Dans un projet de rôle Web, le fichier de démarrage est quant à lui défini dans les propriétés du projet.

À l’origine, le fichier bin\LaunchWorker.ps1 avait été créé pour effectuer une grande partie du travail de préparation, mais cela ne fonctionne pas vraiment. Remplacez le contenu de ce fichier par le script ci-après.

Ce script appelle le fichier worker.py à partir de votre projet Python. Si la variable d'environnement PYTHON2 est définie sur on, Python 2.7 est installé. Dans le cas contraire, le script installé est 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

Les modèles Visual Studio doivent avoir créé un fichier ps.cmd dans le dossier ./bin. Ce script shell appelle les scripts de wrapper PowerShell ci-dessus et assure la journalisation en fonction du nom du wrapper PowerShell appelé. Si ce fichier n’a pas été créé, voici ce qu’il doit contenir.

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

Exécution locale

Si vous définissez votre projet de service cloud comme projet de démarrage et que vous appuyez sur F5, le service cloud s'exécute dans l'émulateur Azure local.

Bien que PTVS puisse être lancé dans l'émulateur, le débogage (ex : points d'arrêt) ne fonctionne pas.

Pour déboguer vos rôles web et vos rôles de travail, vous pouvez définir le projet de rôle comme projet de démarrage, et déboguer ce projet. Vous pouvez aussi définir plusieurs projets de démarrage. Cliquez avec le bouton droit sur la solution, puis sélectionnez Définir comme projet de démarrage.

Solution Startup Project Properties

Publication dans Azure

Pour la publication, cliquez avec le bouton droit sur le projet de service cloud dans la solution, puis sélectionnez Publier.

Microsoft Azure Publish Sign In

Suivez les instructions de l’Assistant. En cas de besoin, activez le Bureau à distance. Le Bureau à distance vous est utile lorsque vous avez besoin de procéder à un débogage.

Une fois que vous avez terminé la configuration des paramètres, cliquez sur Publier.

La progression s'affiche alors dans la fenêtre Sortie, puis vous verrez la fenêtre du Journal d’activité Microsoft Azure.

Microsoft Azure Activity Log Window

Le déploiement prend plusieurs minutes. Ensuite, vos rôles web et/ou de travail sont exécutés sur Azure !

Examiner les journaux d’activité

Une fois que la machine virtuelle du service cloud a démarré et installé Python, vous pouvez examiner les journaux d’activité pour y rechercher d’éventuels messages d’échec. Ces journaux sont stockés dans le dossier C:\Resources\Directory\{role}\LogFiles. PrepPython.err.txt contient au moins une erreur à partir du moment ou le script tente de détecter l’installation de Python. Il est possible quePipInstaller.err.txt signale l’existence d’une version obsolète de pip.

Étapes suivantes

Pour plus d'informations sur l'utilisation des rôles web et de travail dans les outils Python pour Visual Studio, consultez la documentation PTVS :

Pour plus d’informations sur l’utilisation des services Azure à partir de vos rôles web et de travail, telles que l’utilisation d’Azure Storage ou Service Bus, consultez les articles suivants :