Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
Cloud Services (clásico) ahora está en desuso para todos los clientes a partir del 1 de septiembre de 2024. Microsoft detendrá y cerrará todas las implementaciones en curso y los datos se perderán de forma permanente a partir de octubre de 2024. Las nuevas implementaciones deben usar el nuevo modelo de implementación basado en Azure Resource Manager Azure Cloud Services (soporte extendido).
En este artículo se proporciona información general sobre el uso de roles web y de trabajo de Python mediante Herramientas de Python para Visual Studio. Obtenga información acerca de cómo usar Visual Studio para crear e implementar un servicio en la nube básico que usa Python.
Prerrequisitos
- Visual Studio 2013, 2015 o 2017
- Herramientas de Python para Visual Studio (PTVS)
-
Azure SDK Tools para Visual Studio (VS) 2013 o
Herramientas del SDK de Azure para VS 2015 o
Herramientas del SDK de Azure para VS 2017 - Python 2.7 de 32 bits o Python 3.8 de 32 bits
Nota:
Para completar este tutorial, deberá tener una cuenta de Azure. Puede activar las ventajas del suscriptor de Visual Studio o registrarse para obtener una evaluación gratuita.
¿Qué son los roles web y de trabajo de Python?
Azure proporciona tres modelos de proceso para ejecutar aplicaciones: característica Web Apps en Azure App Service, Azure Virtual Machines y Azure Cloud Services. Los tres modelos admiten Python. Cloud Services, que incluyen roles web y de trabajo, proporcionan plataforma como servicio (PaaS). Dentro de un servicio en la nube, un rol web proporciona un servidor web dedicado de Internet Information Services (IIS) para alojar aplicaciones web de front-end. Un rol de trabajo puede ejecutar tareas asincrónicas, de ejecución prolongada o perpetuas, independientes de la entrada o la interacción del usuario.
Para obtener más información, consulte ¿Qué es un servicio en la nube?.
Nota:
¿Quieres crear un sitio web sencillo?
Si el escenario solo requiere un sitio web de front-end sencillo, considere la posibilidad de usar la característica Web Apps ligera en Azure App Service. Puede actualizar a un Servicio en la nube más adelante, cuando su sitio web sea más grande y sus requisitos cambien. Consulte el Centro para desarrolladores de Python para obtener artículos que tratan el desarrollo de la característica Web Apps en Azure App Service.
Creación de un proyecto
En Visual Studio, puede seleccionar Azure Cloud Service en el cuadro de diálogo Nuevo proyecto , en Python.
En el asistente de Servicio en la Nube de Azure, puede crear nuevos roles web y de trabajo.
La plantilla de rol de trabajo incluye código estándar para conectar a una cuenta de almacenamiento de Azure o Azure Service Bus.
Puede agregar roles web o de trabajo a un servicio en la nube que ya existe en cualquier momento. Puede optar por agregar proyectos existentes a su solución o por crear otros nuevos.
Su servicio en la nube puede contener roles implementados en diferentes lenguajes. Por ejemplo, puede tener un rol web de Python implementado con Django, con Python o con roles de trabajo de C#. Puede comunicarse fácilmente entre sus roles usando colas de Service Bus o colas de almacenamiento.
Instalación de Python en el servicio en la nube
Advertencia
No funcionan los scripts de configuración que se instalaron con Visual Studio (en el momento en que se actualizó por última vez este artículo). En esta sección se describe una solución alternativa.
El principal problema con los scripts de instalación es que no instalan Python. En primer lugar, defina dos tareas de inicio en el archivo ServiceDefinition.csdef . La primera tarea (PrepPython.ps1) descarga e instala el entorno de ejecución de Python. La segunda tarea (PipInstaller.ps1) ejecuta pip para instalar las dependencias que pueda tener.
Los siguientes scripts se escribieron para Python 3.8. Si desea usar la versión 2.x de Python, establezca el archivo de la variable PYTHON2en para las dos tareas de inicio y la tarea en tiempo de ejecución: <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>
Las variables PYTHON2 y PYPATH deben agregarse a la tarea de inicio del trabajador. La variable PYPATH solo se usa si la variable PYTHON2 está establecida en activado.
<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>
Archivo de ejemplo 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>
A continuación, cree los archivos PrepPython.ps1 y PipInstaller.ps1 en la carpeta ./bin del rol.
PrepPython.ps1
Este script instala Python. Si la variable de entorno PYTHON2 está establecida en activado, se instala Python 2.7; de lo contrario, se instala 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
Este script llama a pip e instala todas las dependencias en el archivo requirements.txt . Si la variable de entorno PYTHON2 está establecida en activado, se usa Python 2.7; de lo contrario, se usa 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"
}
}
Modificación del archivo LaunchWorker.ps1
Nota:
En el caso de un proyecto de rol de trabajador, se requiere el archivo LauncherWorker.ps1 para ejecutar el archivo de inicio. En un proyecto de rol web, el archivo de arranque se define en las propiedades del proyecto.
El cubo\LaunchWorker.ps1 se creó originalmente para hacer mucho trabajo de preparación, pero realmente no funciona. Reemplace el contenido del archivo por el script siguiente.
Este script llama al archivo worker.py del proyecto de Python. Si la variable de entorno PYTHON2 está establecida en activado, se usa Python 2.7; de lo contrario, se usa 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
Las plantillas de Visual Studio probablemente crearon un archivo ps.cmd en la carpeta ./bin . Este script de shell llama a los scripts contenedores de PowerShell anteriores y proporciona registros basados en el nombre del script contenedor de PowerShell llamado. Si este archivo no se ha creado, el siguiente script estará en él:
@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"
Ejecución en modo local
Si establece su proyecto de servicio en la nube como proyecto de inicio y presiona F5, el servicio en la nube se ejecuta en el emulador de Azure local.
Aunque PTVS admite el inicio en el emulador, la depuración (por ejemplo, puntos de interrupción) no funciona.
Para depurar tus roles web y de trabajo, puedes configurar el proyecto de rol como proyecto de inicio y luego depurarlo. También puede configurar varios proyectos de inicio. Haga clic con el botón derecho en la solución y seleccione Establecer proyectos de inicio.
Publicar en Azure
Para publicar, haga clic con el botón derecho en el proyecto de servicio en la nube en la solución y seleccione Publicar.
Siga el asistente. Si es necesario, habilite el Escritorio remoto. El Escritorio remoto es útil cuando necesites depurar algo.
Cuando termine de configurar las opciones, elija Publicar.
Aparece algún progreso en la ventana de salida y, a continuación, verá la ventana Registro de actividad de Microsoft Azure.
La implementación tarda varios minutos y después sus roles web y/o de trabajo estarán ejecutándose en Azure.
Investiga los registros
Después de que la máquina virtual del servicio en la nube se inicie e instale Python, puede mirar los registros para buscar mensajes de error. Estos registros se encuentran en la carpeta C:\Resources\Directory\{role}\LogFiles . PrepPython.err.txt tiene al menos un error en él cuando el script intenta detectar si Python está instalado y PipInstaller.err.txt puede quejarse de una versión obsoleta de pip.
Pasos siguientes
Para obtener información detallada sobre el trabajo con roles web y de trabajo en Python Tools para Visual Studio, consulte la documentación de PTVS:
Para más información sobre el uso de servicios de Azure desde roles web y de trabajo, como el uso de Azure Storage o Service Bus, consulte los siguientes artículos: