c# - Ejecutar código de Python en un entorno.NET sin instalar Python
ironpython python.net (5)
¿Es posible producir código Python en un entorno .NET / C # sin instalar Python y sin convertir el código Python a C #, es decir, simplemente implementar el código tal como está?
Sé que la instalación del lenguaje Python sería algo razonable, pero mi duda es que no quiero introducir un nuevo idioma en mi entorno de producción y lidiar con sus complicaciones de mantenimiento y pruebas, ya que no tengo suficiente personal Quienes conocen a Python para encargarse de estos problemas.
Sé que IronPython se basa en CLR, pero no sé cómo se puede alojar y mantener exactamente dentro de .NET. ¿Le permite a uno tratar el código PYthon como un "paquete" que se puede importar en el código C #, sin instalar realmente Python como un lenguaje independiente? ¿Cómo puede IronPython hacer mi vida más fácil en esta situación? ¿Puede python.net darme más apalancamiento?
Como mencioné en los comentarios, la mejor y mejor manera de hacerlo es crear servicios Restful sobre su código
Python
y realizar solicitudes http desde el código
C#
.
No sé cuánto sabes sobre web-frameworks en Python, pero hay muchos de ellos que puedes usar.
Para su necesidad, sugeriría
Flask
que es un micro-framework ligero para crear servicios web Restful.
Este es un servicio web de Flask muy simple para el ejemplo: (puede consultar una versión en ejecución here , lo alojé en pythonOnEverywhere)
from flask import Flask
app = Flask(__name__)
@app.route(''/'')
def hello_world():
return ''Hello from Flask!''
@app.route(''/math/add/<int:num1>/<int:num2>'')
def add(num1, num2):
return ''%d'' % (num1+num2)
Este servicio simple, suma dos números y devuelve la suma de ellos.
Y Código
C#
:
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
// Always use HttpClient as a singleton object
public static HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("http://al1b.pythonanywhere.com") } ;
public async static Task Main()
{
var num1 = 1;
var num2 = 4;
Console.WriteLine("Making http-request wait .../r/n");
var mathAddResult = await _httpClient.GetAsync($"/math/add/{num1}/{num2}");
// 200 = OK
if(mathAddResult.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine(await mathAddResult.Content.ReadAsStringAsync());
}
}
}
La salida:
Making http-request wait ...
5
La versión de ejecución del código anterior ahora se puede ejecutar en .NET Fiddle .
TL; DR:
Para comprender y aprender a Flask, eche un vistazo a sus documentions . (Es corto y bien). Estoy seguro de que tendrá servicios web complejos, como la aceptación de objetos complejos o pocco como entradas de su servicio web y la devolución de objetos complejos (como json) como resultados de servicios web.
En ese caso, necesita saber cómo funciona Flask
jsonify
. Este enlace le dirá
how
.
Ok, por otro lado, en tu aplicación C # también tendrás esos objetos y escenarios complejos. Necesitas saber cómo serializar, deseriaze y etc.
Microsoft hizo un gran trabajo para sus tutoriales aquí:
y
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8
IronPython es limitado en comparación con la ejecución de Python con bibliotecas basadas en C que necesitan el intérprete de Python, no el .NET DLR. Supongo que depende de cómo utilice el código de Python; si desea utilizar muchas bibliotecas de Python de terceros, dudo que IronPython se ajuste a sus necesidades.
¿Qué pasa con la creación de una aplicación Python completa pero ejecutándola todo desde Docker?
Eso requeriría que sus entornos tengan Docker instalado, pero también podría implementar sus aplicaciones .NET usando Docker, y todas estarían aisladas y no ensuciarían su "entorno".
Hay imágenes base de docker disponibles específicamente para Building Python y .NET Project y también para ejecutar.
Realmente no entiendo la pregunta. No desea instalar python, no desea introducirlo en su sistema, ya que tiene un costo de mantenimiento adicional y su equipo carece de los conocimientos básicos. Aún así, quieres "producirlo" sin que nadie lo sepa.
Supongo que quieres tener un lenguaje de scripting, y por alguna razón te decidiste por python. Mi respuesta se basa en este supuesto.
IronPython es la razón por la que tenemos palabras clave
dynamic
y DLR en el mundo .net.
Puede alojarlo en su aplicación y hacer que compile algo de código python para tipos compatibles con .net.
La propia documentación de IronPython lo menciona https://ironpython.net/documentation/dotnet/dotnet.html#accessing-python-code-from-other-net-code
También hay una publicación en el blog de MSDN que muestra cómo hacerlo. https://blogs.msdn.microsoft.com/seshadripv/2008/06/30/how-to-invoke-a-ironpython-function-from-c-using-the-dlr-hosting-api/
Espero eso ayude
Si debe ejecutar algo de código Python desde un .NET y no desea enviar Python con la aplicación, debe compilar el código Python en un EXE utilizando algo como https://cython.org/
Puede pasarle variables en la línea de comandos y recibir respuestas de una función de Python escribiendo en la consola de Python y capturando la salida del proceso que generó desde .NET. De esta manera, funcionaría como llamar a cualquier otra Sub o Función, la única diferencia es que cada procedimiento es un nuevo proceso para .NET. Esto podría complicarse mucho si desea pasar objetos complejos de un lado a otro, ya que tendría que desenvolverlos y envolverlos a medida que fluyen, como texto, entre los componentes.
En última instancia, sería mejor reescribir su código Python en .NET y no seguir este camino en absoluto. Use una herramienta de conversión como https://github.com/uxmal/pytocs para convertir todo el código Python a C #. Es probable que no sea perfecto, pero le dará una base de código para trabajar en el reemplazo de las funciones de Python que desea usar. Le llevará menos tiempo limpiar los procedimientos traducidos que tratar de mantener entre ambos idiomas y funciones interoperativas.
Si no desea introducir un nuevo idioma en su entorno de producción, debe mantener todo su código C #, en lugar de introducir python.
Dicho esto, no es necesario que ''instales'' el tiempo de ejecución de Python, sino que deberías tener un tiempo de ejecución disponible. Si eso implica instalar un paquete nuget, alguna implementación mono o lo que sea, vas a confiar en alguna dependencia para interpretar los comandos de python.
Aquí hay un artículo que creo que responde a tu pregunta. Cómo usar un paquete empaquetado de Python sin instalarlo