c# - Exécution de code Python dans un environnement.NET sans installer Python




ironpython python.net (4)

Est-il possible de produire du code Python dans un environnement .NET / C # sans installer Python et sans convertir le code Python en C #, c'est-à-dire simplement déployer le code tel quel?

Je sais que l’installation du langage Python serait raisonnable, mais j’ai une hésitation à ne pas simplement introduire un nouveau langage dans mon environnement de production et faire face à ses complications de test et de maintenance car je n’ai pas assez de main-d’œuvre. qui connaissent Python pour s’occuper de ces problèmes.

Je sais que IronPython est basé sur le CLR, mais je ne sais pas comment exactement il peut être hébergé et maintenu dans .NET. Cela permet-il de traiter le code PYthon comme un "package" pouvant être importé dans du code C #, sans pour autant installer Python en tant que langage autonome? Comment IronPython peut-il me faciliter la vie dans cette situation? Python.net peut-il me donner plus de poids?


Comme je l'ai mentionné dans les commentaires, la meilleure et la meilleure solution consiste à créer des services Restful sur votre code Python et à effectuer des requêtes http à partir du code C# . Je ne sais pas ce que vous savez sur les frameworks Web en Python, mais vous en avez des tonnes que vous pouvez utiliser. Pour vos besoins, je suggérerais Flask un micro-framework web léger permettant de créer des services Web reposants.

Ceci est un service Web Flask très simple pour l'exemple: (vous pouvez en vérifier une version en cours here , je l'ai hébergé sur 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)

Ce service simple, ajoute deux nombre et renvoie la somme d'entre eux.

Et code 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());
        }
    }
}

Le résultat:

Making http-request wait ... 

5

La version actuelle du code ci-dessus est maintenant exécutable sur .NET Fiddle .

TL; DR:

Pour comprendre et apprendre Flask, jetez un œil à ses documentions . (C'est court et bien). Je suis sûr que vous aurez des services Web complexes, tels que l’acceptation d’objets complexes ou pocco comme entrées de service Web et le renvoi d’objets complexes (comme json) comme résultats de service Web.

Dans ce cas, vous devez savoir comment fonctionne Flask jsonify . Ce lien vous how .

D'un autre côté, dans votre application C #, vous aurez également ces objets et scénarios complexes. Vous devez savoir comment sérialiser, désérier, etc.

Microsoft a fait un excellent travail pour ses tutoriels ici:

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

et

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8


IronPython est limité par rapport à l'exécution de Python avec des bibliothèques basées sur C nécessitant l'interpréteur Python, pas le DLR .NET. Je suppose que cela dépend de la manière dont vous utilisez le code Python. Si vous souhaitez utiliser un grand nombre de bibliothèques Python tierces, je doute qu'IronPython réponde à vos besoins.

Pourquoi ne pas créer une application Python complète mais tout exécuter à partir de Docker?

Cela nécessiterait l'installation de Docker dans vos environnements, mais vous pourriez également déployer vos applications .NET à l'aide de Docker également. Elles seraient toutes isolées et ne pollueraient pas votre "environnement".

Il existe des images de base de docker qui sont spécifiquement conçues pour la construction de projets Python et .NET, ainsi que pour l'exécution.


Si vous devez exécuter du code Python à partir d'un fichier .NET et que vous ne souhaitez pas utiliser Python avec l'application, vous devez simplement compiler le code Python en un fichier EXE à l'aide de quelque chose comme https://cython.org/

Vous pouvez lui transmettre des variables en ligne de commande et recevoir des réponses d'une fonction Python en écrivant sur la console à partir de Python et en capturant la sortie du processus généré par .NET. De cette façon, cela fonctionnerait comme si vous appeliez n'importe quel autre sous ou fonction, la seule différence est que chaque procédure est un nouveau processus pour .NET. Cela peut devenir très compliqué si vous souhaitez passer d’objets complexes en alternance, car vous devez les dérouler et les envelopper au fur et à mesure qu’ils circulent, sous forme de texte, entre les composants.

En fin de compte, vous feriez mieux de réécrire votre code Python dans .NET et de ne pas suivre ce chemin du tout. Utilisez un outil de conversion tel que https://github.com/uxmal/pytocs pour convertir tout le code Python en C #. Ce ne sera probablement pas parfait, mais cela vous donnera une base de code pour remplacer les fonctions Python que vous souhaitez utiliser. Il vous faudra moins de temps pour nettoyer les procédures traduites que pour essayer de maintenir les deux langues et les fonctions inter-op entre elles.


Si vous ne souhaitez pas introduire un nouveau langage dans votre environnement de production, conservez l'intégralité de votre code C # au lieu d'introduire python.

Cela dit, vous n'avez pas besoin d'installer le runtime Python, mais vous devez disposer d'un runtime disponible. Si cela implique l'installation d'un paquet de nuget, d'une implémentation mono ou autre, vous allez dépendre d'une dépendance pour interpréter les commandes python.

Voici un article qui, je crois, répond à votre question. Comment utiliser un paquet Python emballé sans l'installer







python.net