Role Sieć Web i Proces roboczy języka Python z programem Python Tools for Visual Studio
Ważne
Usługi Cloud Services (wersja klasyczna) są teraz przestarzałe dla wszystkich klientów od 1 września 2024 r. Wszystkie istniejące uruchomione wdrożenia zostaną zatrzymane i zamknięte przez firmę Microsoft, a dane zostaną przypadkowo utracone od października 2024 r. Nowe wdrożenia powinny używać nowego modelu wdrażania opartego na usłudze Azure Resource Manager w usługach Azure Cloud Services (wsparcie dodatkowe).
Ten artykuł zawiera omówienie sposobu użycia ról Sieć Web i Proces roboczy języka Python za pomocą narzędzi Python Tools for Visual Studio. Dowiedz się, jak używać programu Visual Studio do tworzenia i wdrażania podstawowej usługi w chmurze, która używa języka Python.
Wymagania wstępne
- Program Visual Studio w wersji 2013, 2015 lub 2017
- Python Tools for Visual Studio (PTVS)
- Azure SDK Tools for Visual Studio (VS) 2013 lub
Azure SDK Tools for VS 2015 lub
Azure SDK Tools for VS 2017 - 32-bitowy język Python 2.7 lub Python 3.8 w wersji 32-bitowej
Uwaga
Do wykonania kroków tego samouczka potrzebne jest konto platformy Azure. Możesz aktywować korzyści dla subskrybentów programu Visual Studio lub zarejestrować się w celu uzyskania bezpłatnego demo.
Co to są role Sieć Web i Proces roboczy języka Python?
Platforma Azure udostępnia trzy modele obliczeniowe na potrzeby uruchamiania aplikacji: funkcja Web Apps w usłudze Azure App Service, Azure Virtual Machines i Azure Cloud Services. Wszystkie trzy modele obsługują język Python. Usługi Cloud Services, które obejmują role Sieć Web i Proces roboczy, udostępniają rozwiązanie typu Platforma jako usługa (Platform as a Service, PaaS). W ramach usługi w chmurze rola sieci Web zapewnia dedykowany serwer internetowy usług Internet Information Services (IIS) do hostowania aplikacji internetowych frontonu. Rola procesu roboczego może uruchamiać zadania asynchroniczne, długotrwałe lub bezterminowe niezależnie od interakcji lub danych wejściowych użytkownika.
Aby uzyskać więcej informacji, zobacz Co to jest usługa w chmurze?
Uwaga
Chcesz utworzyć prostą witrynę sieci Web?
Jeśli scenariusz obejmuje tylko prosty fronton witryny internetowej, rozważ użycie lekkiej funkcji Web Apps w usłudze App Service. Możesz łatwo przeprowadzić uaktualnienie do usługi w chmurze w przypadku rozwoju witryny sieci Web lub zmiany wymagań. W Centrum deweloperów języka Python można znaleźć artykuły, które dotyczą funkcji Web Apps w usłudze App Service.
Tworzenie projektu
W programie Visual Studio możesz wybrać pozycję Usługa w chmurze platformy Azure w oknie dialogowym Nowy projekt w obszarze Python.
W Kreatorze usługi w chmurze platformy Azure można utworzyć nowe role Sieć Web i Proces roboczy.
Szablon roli procesu roboczego zawiera schematyczny kod służący do nawiązywania połączeń z kontem magazynu Azure lub z usługą Azure Service Bus.
W każdej chwili możliwe jest dodanie roli Sieć Web lub Proces roboczy do istniejącej usługi w chmurze. Możesz dodawać istniejące projekty do rozwiązania lub tworzyć nowe.
Usługa w chmurze może zawierać role zaimplementowane w różnych językach. Na przykład można mieć rolę Sieć Web języka Python zaimplementowaną za pomocą środowiska Django, języka Python lub roli Proces roboczy języka C#. Między rolami można się w łatwy sposób komunikować za pomocą kolejek usługi Service Bus lub kolejek magazynu.
Instalowanie języka Python w usłudze w chmurze
Ostrzeżenie
Skrypty instalacji instalowane z programem Visual Studio (w momencie ostatniej aktualizacji artykułu) nie działają. W tej sekcji opisano sposób obejścia problemu.
Głównym problemem ze skryptami konfiguracji jest to, że nie instalują języka Python. Najpierw należy zdefiniować dwa zadania uruchamiania w pliku ServiceDefinition.csdef. Pierwsze zadanie (PrepPython.ps1) pobiera i instaluje środowiska uruchomieniowe języka Python. Drugie zadanie (PipInstaller.ps1) uruchamia mechanizm pip, aby zainstalować wszystkie zależności.
Następujące skrypty zostały napisane dla języka Python w wersji 3.8. Jeśli chcesz korzystać z wersji 2.x języka Python, ustaw plik zmiennej PYTHON2 na on dla dwóch zadań uruchamiania i zadania środowiska uruchomieniowego: <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>
Zmienne PYTHON2 i PYPATH muszą zostać dodane do zadania uruchamiania procesu roboczego. Zmienna PYPATH jest używana tylko wtedy, gdy zmienna PYTHON2 jest ustawiona na wartość 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>
Przykładowy plik 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>
Następnie należy utworzyć pliki PrepPython.ps1 i PipInstaller.ps1 w folderze ./bin roli użytkownika.
PrepPython.ps1
Ten skrypt instaluje język Python. Jeśli zmienna środowiskowa PYTHON2 jest włączona, zostanie zainstalowany język Python 2.7. W przeciwnym razie jest zainstalowany język 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
Ten skrypt wywołuje kod pip i instaluje wszystkie zależności w pliku requirements.txt. Jeśli zmienna środowiskowa PYTHON2 jest ustawiona na włączoną, używany jest język Python 2.7. W przeciwnym razie jest używany język 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"
}
}
Modyfikowanie skryptu LaunchWorker.ps1
Uwaga
W przypadku projektu roli procesu roboczego plik LauncherWorker.ps1 jest wymagany do wykonania pliku uruchamiania. W projektach roli sieci Web plik uruchamiania jest zdefiniowany we właściwościach projektu.
Bin \LaunchWorker.ps1 został pierwotnie utworzony, aby wykonać wiele prac przygotowawczych, ale tak naprawdę nie działa. Zastąp zawartość tego pliku następującym skryptem.
Ten skrypt wywołuje plik worker.py z projektu języka Python. Jeśli zmienna środowiskowa PYTHON2 jest ustawiona na włączoną, używany jest język Python 2.7. W przeciwnym razie jest używany język 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
Szablony programu Visual Studio prawdopodobnie utworzyły plik ps.cmd w folderze ./bin . Ten skrypt powłoki wywołuje poprzednie skrypty otoki programu PowerShell i zapewnia rejestrowanie na podstawie nazwy otoki programu PowerShell. Jeśli ten plik nie został utworzony, w nim znajduje się następujący skrypt:
@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"
Uruchamianie polecenia w środowisku lokalnym
Jeśli ustawisz projekt usługi w chmurze jako projekt startowy i naciśniesz klawisz F5, usługa w chmurze zostanie uruchomiona w lokalnym emulatorze platformy Azure.
Mimo że funkcja PTVS obsługuje uruchamianie w emulatorze, debugowanie (na przykład punkty przerwania) nie działa.
Aby debugować role Sieć Web i Proces roboczy, możesz ustawić projekt roli jako projekt startowy i debugować go zamiast ról. Można również ustawić wiele projektów startowych. Kliknij prawym przyciskiem myszy rozwiązanie, a następnie wybierz pozycję Ustaw projekty startowe.
Publikowanie na platformie Azure
Aby przeprowadzić publikowanie, kliknij prawym przyciskiem myszy projekt usługi w chmurze w rozwiązaniu, a następnie wybierz pozycję Publikuj.
Postępuj zgodnie z instrukcjami kreatora. Jeśli trzeba, włącz pulpit zdalny. Pulpit zdalny jest przydatny w przypadku konieczności debugowania elementów.
Po zakończeniu konfigurowania ustawień wybierz pozycję Publikuj.
W oknie danych wyjściowych zostanie wyświetlony postęp, a następnie zostanie wyświetlone okno Dziennik aktywności platformy Microsoft Azure.
Wdrożenie potrwa kilka minut, a następnie rola internetowa i/lub procesu roboczego będą działać na platformie Azure.
Sprawdzanie dzienników
Po uruchomieniu maszyny wirtualnej usługi w chmurze i zainstalowaniu języka Python można sprawdzić dzienniki pod kątem komunikatów o błędach. Te dzienniki znajdują się w folderze C:\Resources\Directory\{role}\LogFiles . Plik PrepPython.err.txt zawiera co najmniej jeden błąd zwracany, gdy skrypt próbuje wykryć instalację środowiska Python, a plik PipInstaller.err.txt może zgłaszać błąd nieaktualnej wersji kodu pip.
Następne kroki
Bardziej szczegółowe informacje na temat pracy z rolami Sieć Web i Proces roboczy w ramach programu Python Tools for Visual Studio zawiera dokumentacja programu PTVS:
Więcej szczegółów dotyczących korzystania z usług Azure na podstawie roli internetowej i roli procesu roboczego, na przykład używania usługi Azure Storage lub Service Bus, można znaleźć w następujących artykułach: