Поделиться через


Веб- и рабочие роли на Python с инструментами Python для Visual Studio

Это важно

Облачные службы (классическая версия) теперь не поддерживается для всех пользователей с 1 сентября 2024 года. Все существующие запущенные развертывания будут остановлены и завершены корпорацией Майкрософт, и данные будут окончательно потеряны начиная с октября 2024 года. Новые развертывания должны использовать новую модель развертывания azure Resource Manager на основе Облачных служб Azure (расширенная поддержка).

В этой статье представлен обзор использования веб-ролей Python и рабочих ролей с помощью средств Python для Visual Studio. Узнайте, как с помощью Visual Studio создать и развернуть базовую облачную службу, которая использует Python.

Предпосылки

Примечание.

Для работы с этим учебником требуется учетная запись Azure. Вы можете активировать преимущества подписчика Visual Studio или зарегистрироваться для получения бесплатной пробной версии.

Каковы веб- и рабочие роли в Python?

Azure предоставляет три модели вычислений для запуска приложений: функции веб-приложений в Службе приложений Azure, виртуальных машинах Azure и облачных службахAzure. Все три модели поддерживают Python. Облачные службы, которые включают веб- и рабочие роли, предоставляют платформу как услугу (PaaS). В облачной службе веб-роль предоставляет выделенный веб-сервер службы IIS (IIS) для размещения интерфейсных веб-приложений. Рабочая роль может выполнять асинхронные, длительные или бессрочные задачи независимо от взаимодействия пользователя или ввода.

Дополнительные сведения см. в статье "Что такое облачная служба?".

Примечание.

Требуется создать простой веб-сайт? Если вам необходимо создать сайт с простым внешним интерфейсом, воспользуйтесь упрощенными веб-приложениями в службе приложений Azure. По мере роста веб-сайта и изменения требований можно легко выполнить обновление к облачной службе. Ознакомьтесь с центром разработчиков Python для статей, охватывающих разработку функции веб-приложений в Службе приложений Azure.

Создание проекта

В Visual Studio вы можете выбрать облачную службу Azure в диалоговом окне "Создать проект " в разделе Python.

Диалоговое окно

В мастере настройки облачной службы Azure можно создать новую веб-роль и рабочие роли.

Диалоговое окно облачной службы Azure

Шаблон рабочей роли входит в состав стандартного кода для подключения к учетной записи хранения Azure или к служебной шине Azure.

Решение облачной службы

Добавить веб-роль или рабочую роль к уже существующей облачной службе можно в любое время. Также можно добавить к собственному решению существующий проект или создать новые проекты.

Добавление команды роли

В облачной службе могут присутствовать роли, реализованные на различных языках программирования. Например, это может быть веб-роль на Python, реализованная с помощью Django, с рабочими ролями на Python или C#. Вы можете легко обмениваться данными между вашими ролями, используя очереди служебной шины или очереди хранилища.

Установка Python в облачной службе

Предупреждение

Скрипты установки, которые устанавливаются вместе с Visual Studio (на момент последнего обновления этой статьи), не работают. В этом разделе описывается обходное решение.

Основной проблемой сценариев установки является то, что они не устанавливают Python. Сначала определите две задачи запуска в файле ServiceDefinition.csdef . Первая задача (PrepPython.ps1) загружает и устанавливает среду выполнения Python. Вторая задача (PipInstaller.ps1) запускает pip для установки любых зависимостей, которые у вас могут быть.

Приведенные ниже скрипты написаны для Python 3.8. Если вы хотите использовать Python версии 2.x, установите для переменной PYTHON2 значение on для двух начальных задач и задачи исполнения: <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>

Переменные PYTHON2 и PYPATH должны быть добавлены в задачу запуска рабочего процесса. Переменная PYPATH используется только в том случае, если переменной PYTHON2 задано значение 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

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

Создайте файлы PrepPython.ps1 и PipInstaller.ps1 в каталоге ./bin для вашей роли.

PrepPython.ps1

Этот скрипт устанавливает Python. Если переменная окружения PYTHON2 установлена в значение on, то устанавливается Python 2.7, в противном случае устанавливается 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

Этот скрипт вызывает pip и устанавливает все зависимости в файлеrequirements.txt . Если для переменной среды PYTHON2 задано значение , используется Python 2.7, в противном случае используется 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"
    }
}

Изменение файла LaunchWorker.ps1

Примечание.

В случае проекта роли работника, файл LauncherWorker.ps1 необходим для запуска стартового файла. В проекте веб-роли пусковой файл задается в свойствах проекта.

Корзина\LaunchWorker.ps1 была первоначально создана для выполнения много подготовительных работ, но это в действительности не работает. Замените содержимое этого файла на приведенный ниже скрипт.

Этот скрипт вызывает файл worker.py из проекта Python. Если для переменной среды PYTHON2 задано значение , используется Python 2.7, в противном случае используется 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.

Шаблоны Visual Studio, вероятно, создали файл ps.cmd в папке ./bin . Этот скрипт оболочки вызывает предшествующие сценарии PowerShell и ведет журнал на основе имени вызванного скрипта PowerShell. Если этот файл не был создан, следующий сценарий будет в нем:

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

Запуск локально

Если настроить проект облачной службы в качестве запускаемого проекта и нажать клавишу F5, эта облачная служба запустится в локальном эмуляторе Azure.

Хотя PTVS поддерживает запуск в эмуляторе, отладка (например, точки останова) не работает.

Чтобы отладить веб- и рабочие роли, вы можете установить проект роли в качестве запускаемого проекта и выполнять отладку таким образом. Вы можете также установить несколько проектов для запуска. Щелкните правой кнопкой мыши по решению, а затем выберите Настроить начальные проекты.

Свойства проекта запуска решения

Публикация в Azure

Чтобы опубликовать, щелкните правой кнопкой мыши проект облачной службы в решении и выберите "Опубликовать".

Вход в службу публикации Microsoft Azure

Следуйте указаниям мастера. При необходимости включите удаленный рабочий стол. Удалённый рабочий стол полезен, когда нужно что-то отладить.

После завершения настройки параметров нажмите кнопку "Опубликовать".

В окне вывода отобразится некоторый прогресс, а затем вы увидите окно журнала действий Microsoft Azure.

Окно журнала действий Microsoft Azure

Для развертывания потребуется несколько минут, после чего веб-роли и рабочие роли будут запущены на платформе Azure.

Изучение журналов

После того как виртуальная машина в облачной службе запустится и установит Python, можно просмотреть журналы, чтобы найти сообщения о сбое. Эти журналы находятся в папке C:\Resources\Directory\{role}\LogFiles . PrepPython.err.txt имеет по крайней мере одну ошибку в нем, когда скрипт пытается определить, установлен ли Python, и PipInstaller.err.txt может жаловаться на устаревшую версию pip.

Дальнейшие действия

С дополнительной информацией о работе с веб-ролями и рабочими ролями в средствах Python для Visual Studio можно ознакомиться в документации PTVS:

Дополнительные сведения об использовании служб Azure из веб-ролей или рабочих ролей, например об использовании хранилища Azure или служебной шины Azure, см. в следующих статьях: