c# - Ausführen von Python-Code in einer.NET-Umgebung, ohne Python zu installieren




ironpython python.net (4)

Ist es möglich, Python-Code in einer .NET / C # -Umgebung zu produzieren, ohne Python zu installieren und ohne den Python-Code in C # zu konvertieren, dh den Code einfach so bereitzustellen, wie er ist?

Ich weiß, dass die Installation der Python-Sprache die vernünftige Sache ist, aber ich zögere, dass ich meiner Produktionsumgebung keine neue Sprache einführen und mich mit den Test- und Wartungskomplikationen befassen möchte, da ich nicht genug Personal habe die wissen, dass Python sich um diese Probleme kümmert.

Ich weiß, dass IronPython auf CLR basiert, weiß aber nicht, wie genau es in .NET gehostet und verwaltet werden kann. Kann man PYthon-Code als "Paket" behandeln, das in C # -Code importiert werden kann, ohne Python tatsächlich als eigenständige Sprache zu installieren? Wie kann IronPython mir das Leben in dieser Situation erleichtern? Kann mir python.net mehr Hebel geben?


Ich verstehe die Frage wirklich nicht. Sie möchten Python nicht installieren, Sie möchten es nicht in Ihr System einführen, da es zusätzliche Wartungskosten verursacht und Ihrem Team das Grundwissen dazu fehlt. Trotzdem möchten Sie es "produzieren", ohne dass es jemand weiß.

Ich gehe davon aus, dass Sie eine Skriptsprache haben möchten, und aus irgendeinem Grund haben Sie sich für Python entschieden. Meine Antwort basiert auf dieser Annahme.

IronPython ist der Grund, warum wir dynamic Schlüsselwörter und DLR in der .net-Welt haben. Sie können Ihre Anwendung hosten und Python-Code für .net-kompatible Typen kompilieren.

In der Dokumentation von IronPython wird https://ironpython.net/documentation/dotnet/dotnet.html#accessing-python-code-from-other-net-code

Außerdem gibt es einen MSDN-Blogeintrag, der zeigt, wie das geht. https://blogs.msdn.microsoft.com/seshadripv/2008/06/30/how-to-invoke-a-ironpython-function-from-c-using-the-dlr-hosting-api/

Ich hoffe es hilft


IronPython ist im Vergleich zur Ausführung von Python mit C-basierten Bibliotheken, die den Python-Interpreter und nicht die .NET-DLR benötigen, eingeschränkt. Ich nehme an, es hängt davon ab, wie Sie den Python-Code verwenden. Wenn Sie viele Python-Bibliotheken von Drittanbietern verwenden möchten, bezweifle ich, dass IronPython Ihren Anforderungen entspricht.

Wie wäre es, eine vollständige Python-Anwendung zu erstellen, aber alles über Docker auszuführen?

Das würde erfordern, dass Ihre Umgebungen Docker installiert haben, aber Sie könnten Ihre .NET-Anwendungen dann auch mit Docker bereitstellen, und sie wären alle isoliert und würden Ihre "Umgebung" nicht verschmutzen.

Es gibt Basis-Docker-Images, die speziell für das Erstellen von Python und .NET Project sowie für die Ausführung bestimmt sind.


Wenn Sie Python-Code in .NET ausführen müssen und Python nicht mit der App ausgeliefert werden soll, kompilieren Sie den Python-Code einfach unter Verwendung von https://cython.org/ in eine EXE- https://cython.org/

Sie können Variablen in der Befehlszeile übergeben und Antworten von einer Python-Funktion erhalten, indem Sie von Python aus in die Konsole schreiben und die Ausgabe des Prozesses erfassen, den Sie in .NET erzeugt haben. Auf diese Weise würde es genauso funktionieren wie beim Aufrufen anderer Sub- oder Function-Befehle. Der einzige Unterschied besteht darin, dass jede Prozedur ein neuer Prozess in .NET ist. Dies kann sehr kompliziert werden, wenn Sie komplexe Objekte hin- und herschieben möchten, da Sie sie auspacken und einpacken müssen, während sie als Text zwischen den Komponenten fließen.

Letztendlich ist es besser, wenn Sie Ihren Python-Code in .NET neu schreiben und diesen Weg überhaupt nicht beschreiten. Verwenden Sie ein Konvertierungsprogramm wie https://github.com/uxmal/pytocs , um den gesamten Python-Code in C # zu konvertieren. Es wird wahrscheinlich nicht perfekt sein, aber es gibt Ihnen eine Codebasis, um die Python-Funktionen, die Sie verwenden möchten, zu ersetzen. Sie brauchen weniger Zeit, um die übersetzten Prozeduren zu bereinigen, als um zu versuchen, beide Sprachen und die Inter-Op-Funktionen zwischen ihnen beizubehalten.


Wie ich in den Kommentaren erwähnt habe, ist die richtige und bessere Möglichkeit, Restful-Services über Ihren Python Code zu erstellen und http-Anforderungen aus dem C# -Code zu erstellen. Ich weiß nicht, wie viel Sie über Web-Frameworks in Python wissen, aber es gibt Unmengen davon, die Sie verwenden können. Für Ihren Bedarf würde ich Flask vorschlagen, ein leichtes Micro-Web-Framework zur Erstellung von Restful-Web-Services.

Dies ist ein sehr einfacher Flask-Webservice für das Beispiel: (Sie können hier eine laufende Version davon überprüfen, ich habe sie auf pythonOnEverywhere gehostet.)

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)

Dieser einfache Dienst addiert zwei Zahlen und gibt die Summe von ihnen zurück.

Und C# -Code:

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

Die Ausgabe:

Making http-request wait ... 

5

Die aktuelle Version des obigen Codes kann jetzt auf .NET Fiddle ausgeführt werden .

TL; DR:

Werfen Sie einen Blick auf die documentions , um Flask zu verstehen und zu lernen. (Es ist kurz und gut). Ich bin mir sicher, dass Sie komplexe Web-Services haben werden, z. B. komplexe oder pocco-Objekte als Ihre Web-Service-Eingaben akzeptieren und komplexe Objekte (als json) als Web-Serivce-Ergebnisse zurückgeben.

In diesem Fall müssen Sie wissen, wie Flask jsonify funktioniert. Dieser Link zeigt Ihnen, how .

Ok, andererseits haben Sie in Ihrer C # -Anwendung auch diese komplexen Objekte und Szenarien. Sie müssen wissen, wie man serialisiert, deseriazt usw.

Microsoft hat hier hervorragende Arbeit für seine Tutorials geleistet:

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

und

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







python.net