Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Облачные службы (классическая версия) теперь не поддерживается для всех пользователей с 1 сентября 2024 года. Все существующие запущенные развертывания будут остановлены и завершены корпорацией Майкрософт, и данные будут окончательно потеряны начиная с октября 2024 года. Новые развертывания должны использовать новую модель развертывания azure Resource Manager на основе Облачных служб Azure (расширенная поддержка).
В этой статье представлен обзор использования веб-ролей Python и рабочих ролей с помощью средств Python для Visual Studio. Узнайте, как с помощью Visual Studio создать и развернуть базовую облачную службу, которая использует Python.
Предпосылки
- Visual Studio 2013, 2015 или 2017
- Средства Python для Visual Studio (PTVS)
-
Средства Azure SDK для Visual Studio (VS) 2013 или
Средства Azure SDK для VS 2015 или
Средства azure SDK для 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 вы можете выбрать облачную службу Azure в диалоговом окне "Создать проект " в разделе Python.
В мастере настройки облачной службы 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.
Для развертывания потребуется несколько минут, после чего веб-роли и рабочие роли будут запущены на платформе Azure.
Изучение журналов
После того как виртуальная машина в облачной службе запустится и установит Python, можно просмотреть журналы, чтобы найти сообщения о сбое. Эти журналы находятся в папке C:\Resources\Directory\{role}\LogFiles . PrepPython.err.txt имеет по крайней мере одну ошибку в нем, когда скрипт пытается определить, установлен ли Python, и PipInstaller.err.txt может жаловаться на устаревшую версию pip.
Дальнейшие действия
С дополнительной информацией о работе с веб-ролями и рабочими ролями в средствах Python для Visual Studio можно ознакомиться в документации PTVS:
Дополнительные сведения об использовании служб Azure из веб-ролей или рабочих ролей, например об использовании хранилища Azure или служебной шины Azure, см. в следующих статьях: