28 November 2024
Entwickler können in Situationen geraten, in denen sie bereits eine gut etablierte und getestete C#-Bibliothek haben, die ihre Funktionen hervorragend erfüllt. Ihre Kunden arbeiten jedoch in einer Python-Umgebung und benötigen Zugriff auf die Funktionalität dieser Bibliothek. In solchen Fällen müssen Entwickler Wege finden, die C#-Bibliothek zugänglich für die Nutzung in Python zu machen. In diesem Artikel werden wir zwei Ansätze zur Lösung dieser Aufgabe untersuchen – Wrapping und Code-Konvertierung – und deren Vor- und Nachteile diskutieren. Dies wird Ihnen helfen, die am besten geeignete Methode auszuwählen und den einfachen Zugriff auf die Funktionalität Ihrer C#-Bibliothek in Python sicherzustellen.
Wie bereits erwähnt, gibt es zwei Hauptmethoden zur Integration von C#-Code in die Python-Umgebung: Wrapping und Code-Konvertierung.
Lassen Sie uns jede dieser Methoden genauer betrachten.
Die Konvertierung von Code zwischen Programmiersprachen kann eine herausfordernde Aufgabe sein, besonders wenn die Sprachen unterschiedliche Paradigmen und syntaktische Merkmale aufweisen. Viele grundlegende Konstrukte von C# und Python sind jedoch ähnlich, sodass der Konvertierungsprozess in einfachen Fällen auf Syntaxänderungen und die Anpassung bestimmter Konzepte hinausläuft.
Beispiel einer C#-Bibliothek (MyLibrary.cs)
using System;
namespace MyLibrary
{
public class Greeting
{
public string SayHello(string name)
{
return $"Hello, {name}!";
}
}
}
Übersetzung der Bibliothek in Python (mylibrary.py)
class Greeting:
def say_hello(self, name):
return f"Hello, {name}!"
Beispiel für die Verwendung der übersetzten Bibliothek in einem Python-Projekt
# Unsere Klasse importieren
from mylibrary import Greeting
# Eine Instanz der Greeting-Klasse erstellen
greet = Greeting()
# Die say_hello-Methode verwenden
message = greet.say_hello("World")
print(message)
In einem so einfachen Beispiel sieht die Konvertierung sehr verlockend aus, nicht wahr? Aber lassen Sie uns die Vor- und Nachteile dieser Methode betrachten.
Zum Beispiel wäre die Konvertierung des folgenden Codes in Python sehr herausfordernd:
using System;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace MyLibrary
{
public class Greeting
{
public string SayHello(string name)
{
var tree = CSharpSyntaxTree.ParseText($"public class Hello {{ public string Name => \"{name}\"; }}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var classDeclaration = (ClassDeclarationSyntax)root.Members[0];
var className = classDeclaration.Identifier.Text;
return $"Parsed class name: {className}";
}
}
}
Sehr oft können Fragen zur Arbeitsintensität, Leistung und externen Abhängigkeiten kritisch werden, was zur Erwägung einer anderen Methode zur Integration von C#-Bibliotheken in Python führt – der Erstellung eines Wrappers.
Wrapping von C#-Code beinhaltet die Erstellung einer Schnittstelle, die C#-Code mit Python unter Verwendung spezialisierter Bibliotheken oder Werkzeuge verbindet. Dies ermöglicht es, Methoden, die in C# geschrieben wurden, direkt aus Python-Code aufzurufen. Der Vorteil dieses Ansatzes liegt darin, dass der vorhandene Code nicht neu geschrieben werden muss, was Zeit und Aufwand spart – der ursprüngliche C#-Code bleibt unverändert. Darüber hinaus können Sie alle Möglichkeiten des .NET-Ökosystems nutzen, ohne sich um die Portierung dieser Funktionen nach Python sorgen zu müssen.
Es gibt mehrere Methoden zum Wrapping von C#-Code, wobei die Verwendung der Python.NET Bibliothek und spezialisierter Werkzeuge wie unserem CodePorting.Wrapper Cs2Python am beliebtesten ist.
Die oben genannte C#-Bibliothek MyLibrary
kann in Python wie folgt verwendet werden:
import clr
clr.AddReference("MyLibrary.dll")
from MyLibrary import Greeting
greet = Greeting()
message = greet.SayHello("World")
print(message)
Wenn es Abhängigkeiten von Microsoft.CodeAnalysis
gibt, wird die Situation komplexer:
import clr
# Hinzufügen aller Abhängigkeiten
clr.AddReference("Microsoft.CodeAnalysis.dll")
clr.AddReference("Microsoft.CodeAnalysis.CSharp.dll")
...
clr.AddReference("System.Collections.Immutable.dll")
clr.AddReference("MyLibrary.dll")
from MyLibrary import Greeting
greet = Greeting()
message = greet.SayHello("World")
print(message)
Die Notwendigkeit, externe Abhängigkeiten explizit zu verbinden, und andere Einschränkungen, wie Schwierigkeiten beim Übertragen bestimmter Datentypen, können die Verwendung der Python.NET-Bibliothek zur Integration von C#-Code erschweren. In solchen Fällen lohnt es sich, alternative Werkzeuge in Betracht zu ziehen, die möglicherweise bequemere und automatisierte Lösungen bieten.
CodePorting.Wrapper Cs2Python bietet eine bequeme Möglichkeit, eine C#-Bibliothek in Python zu integrieren, indem eine standardmäßige Python-Erweiterung in Form eines Wheel-Pakets (WHL) erstellt wird, das über pip
einfach installiert und in Python-Projekten verwendet werden kann. Dieses Werkzeug generiert automatisch eine Zwischenschicht, die C#-Code mit Python verbindet. Darüber hinaus werden alle Abhängigkeiten der C#-Bibliothek automatisch in das Paket aufgenommen.
Die Verwendung der MyLibrary
-Bibliothek, die mit CodePorting.Wrapper Cs2Python umschlossen wurde, sieht in beiden Fällen folgendermaßen aus:
from mylibrary import Greeting
greet = Greeting()
message = greet.say_hello("World")
print(message)
Wie Sie sehen, entspricht dies genau dem Anwendungsbeispiel im Fall der vollständigen Code-Konvertierung. Wir mussten jedoch den Microsoft.CodeAnalysis
-Code nicht nach Python konvertieren oder ein entsprechendes Äquivalent finden.
Nun betrachten wir die Vor- und Nachteile der Integration von C#-Code in Python mithilfe von Wrapping.
pip
macht den Prozess einfach und intuitiv. Dies ermöglicht es Benutzern, die Funktionalität der Bibliothek leicht in ihre Projekte zu integrieren und zu nutzen, ohne tiefgehende technische Kenntnisse zu benötigen.Die Integration von C#-Bibliotheken in Python ermöglicht es Ihnen, vorhandenen C#-Code effektiv in Python-Projekten zu nutzen. Die Wahl zwischen Wrapping und Code-Konvertierung hängt von den spezifischen Bedürfnissen des Projekts ab. Wrapping ermöglicht die schnelle und einfache Nutzung von C#-Bibliotheken in Python, was Zeit und Aufwand minimiert. Die Code-Konvertierung erfordert mehr Ressourcen, kann jedoch eine tiefere Integration bieten.
Die richtige Wahl der Integrationsmethode hilft Ihnen, die Nutzung der Ressourcen zu maximieren und Ihre Ziele zu erreichen.