Использование веб-ролей и рабочих ролей Python с помощью средств Python для Visual Studio
Внимание
Облачные службы (классическая версия) теперь устарела для всех клиентов с 1 сентября 2024 года. Все существующие запущенные развертывания будут остановлены и завершены корпорацией Майкрософт, и данные будут постоянно потеряны начиная с октября 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой. Это новая модель развертывания на основе Azure Resource Manager.
В этой статье представлен обзор способов использования веб-ролей и рабочих ролей Python с помощью инструментов Python для Visual Studio. Узнайте, как с помощью Visual Studio создать и развернуть базовую облачную службу, которая использует Python.
Необходимые компоненты
- Visual Studio 2013, 2015 или 2017
- Инструменты Python для Visual Studio (PTVS)
- Средства azure SDK для Visual Studio (VS) 2013 или
Инструменты пакета SDK для Azure для VS 2015 или
Инструменты пакета SDK для Azure для VS 2017 - Python 2.7 (32-разрядная версия) или Python 3.8 (32-разрядная версия)
Примечание.
Для работы с этим учебником требуется учетная запись Azure. Вы можете активировать преимущества подписчика Visual Studio или зарегистрироваться для получения бесплатной пробной версии.
Что такое веб-роли и рабочие роли Python?
Azure предоставляет три вычислительные модели запуска приложений: веб-приложения в службе приложений Azure, виртуальные машины Azure и облачные службы Azure. Все три модели поддерживают Python. Облачные службы, которые включают в себя веб-роли и рабочие роли, предоставляют платформу как службу (PaaS). В облачной службе веб-роль предоставляет выделенный веб-сервер службы IIS (IIS) для размещения интерфейсных веб-приложений. Рабочая роль может выполнять асинхронные, длительные или бессрочные задачи независимо от взаимодействия пользователя или ввода.
Дополнительные сведения см. в разделе Информация об облачных службах.
Примечание.
Требуется создать простой веб-сайт?
Если вам необходимо создать сайт с простым внешним интерфейсом, воспользуйтесь упрощенными веб-приложениями в службе приложений Azure. По мере роста веб-сайта и изменения требований можно легко выполнить обновление к облачной службе. В Центре разработчиков Python можно найти статьи, посвященные разработке веб-приложений в службе приложений Azure.
Создание проекта
В Visual Studio в диалоговом окне Новый проект в разделе 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>
Далее в папке ./bin своей роли создайте файлы PrepPython.ps1 и PipInstaller.ps1.
Файл 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 задано значение on, будет использоваться 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 необходим для выполнения файла запуска. В проекте веб-роли файл запуска определяется в свойствах проекта.
Bin\LaunchWorker.ps1 изначально создан для много работы подготовки, но это не работает. Замените содержимое этого файла на приведенный ниже скрипт.
Этот скрипт вызывает файл worker.py из проекта Python. Если для переменной среды PYTHON2 задано значение on, будет использоваться 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.
Для развертывания потребуется несколько минут, после чего веб-роли и рабочие роли будут запущены на платформе Azure.
Изучение журналов
После того как виртуальная машина в облачной службе запустится и установит Python, можно просмотреть журналы, чтобы найти сообщения о сбое. Эти журналы расположены в папке C:\Resources\Directory\{role}\LogFiles. В файле PrepPython.err.txt содержится по крайней мере одна ошибка, которая возникает при попытке скрипта обнаружить, установлен ли язык Python. В файле PipInstaller.err.txt может быть сообщение о том, что существующая версия PIP устарела.
Следующие шаги
С дополнительной информацией о работе с веб-ролями и рабочими ролями в средствах Python для Visual Studio можно ознакомиться в документации PTVS:
- Azure Cloud Service Projects for Python (Проекты для облачной службы Azure для Python)
Дополнительные сведения об использовании служб Azure из веб-ролей или рабочих ролей, например об использовании хранилища Azure или служебной шины Azure, см. в следующих статьях: