Saltar al contenido

Ejecutar código de Python en el entorno .NET sin instalar Python

Rafael, parte de nuestro staff, nos ha hecho el favor de crear este tutorial porque controla perfectamente el tema.

Solución:

Si no desea introducir un nuevo lenguaje en su entorno de producción, debe mantener todo su código C#, en lugar de introducir Python.

Dicho esto, no necesita ‘instalar’ el tiempo de ejecución de python, pero necesitaría tener un tiempo de ejecución disponible. Si eso implica instalar un paquete nuget, alguna implementación mono o lo que sea, dependerá de alguna dependencia para interpretar los comandos de python.

Aquí hay un artículo, que creo que responde a su pregunta. Cómo usar un paquete de python empaquetado sin instalarlo

Como mencioné en los comentarios, la forma correcta y mejor de hacerlo es crear servicios Restful sobre su Python código y hacer solicitudes http desde el C# código. No sé cuánto sabes sobre marcos web en Python, pero hay muchos que puedes usar. Para su necesidad, sugeriría Flask, que es un micro-framework web liviano 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 aquí, lo alojé en pythonOnEverywhere)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'

@app.route('/math/add//')
def add(num1, num2):
    return '%d' % (num1+num2)

Este servicio simple, suma dos números y devuelve la suma de ellos.

Y C# Código:

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 ...rn");      

        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 en ejecución del código anterior ahora se puede ejecutar en .NET Fiddle.

TL;RD:

Para comprender y aprender Flask, eche un vistazo a sus documentaciones. (Es corto y bien). Estoy seguro de que tendrá servicios web complejos, como aceptar objetos complejos o pocco como entradas del servicio web y devolver objetos complejos (como json) como resultados del servicio web.

En ese caso, necesita saber cómo Flask jsonify funciona, este enlace le dirá cómo.

Bien, por otro lado, en su aplicación C# también tendrá esos objetos y escenarios complejos. Necesita saber cómo serializar, deserializar, etc.

Microsoft hizo un gran trabajo con sus tutoriales aquí:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

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 DLR de .NET. Supongo que depende de cómo esté usando el código de Python, si desea usar muchas bibliotecas de Python de terceros, dudo que IronPython se ajuste a sus necesidades.

¿Qué hay de construir una aplicación de Python completa pero ejecutándola desde Docker?

Eso requeriría que sus entornos tengan Docker instalado, pero luego también podría implementar sus aplicaciones .NET usando Docker, y todas estarían aisladas y no ensuciarían su ‘entorno’.

Existen imágenes base de la ventana acoplable que son específicas para construir Python y .NET Project y también para ejecutar.

Comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *