Mit ctypes in python den Zugriff auf eine C# dll ' s Methoden
Ich möchte zu implementieren C# - code in einem kritischen Teil meiner python-Programm, um es schneller zu machen. Es sagt (für Python-Dokumentation und diese Website) Sie können das laden einer Dynamic Link Library (und so sagen die PyDocs) wie folgt:
cdll.LoadLibrary("your-dll-goes-here.dll")
Dies ist der Teil von meinem code, der kümmert sich um dieses feature:
from ctypes import *
z = [0.0,0.0]
c = [LEFT+x*(RIGHT-LEFT)/self.size, UP+y*(DOWN-UP)/self.size]
M = 2.0
iterator = cdll.LoadLibrary("RECERCATOOLS.dll")
array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)
z = complex(array_result[0],array_result[1])
c = complex(array_result[2],array_result[3])
last_iteration = int(round(array_result[4]))
Und die RECERCATOOLS.dll dass ich benutze, ist dieses C# - code, der nicht C oder C++):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KarlsTools;
public class Program
{
public static Array ITERATE(double z_r,double z_i,double c_r,
double c_i, int iterations,
double limit)
{
Complex z = new Complex(z_r, z_i);
Complex c = new Complex(c_r, c_i);
for (double i = 1; Math.Round(i) <= iterations; i++)
{
z = Complex.Pow(z, 2) + c;
if (Complex.Abs(z) < limit)
{
double[] numbers = new double[] { Complex.Real(z),
Complex.Imag(z),
Complex.Real(c),
Complex.Imag(c),
i};
return numbers;
}
}
double iter = iterations;
double[] result = new double[] { Complex.Real(z),
Complex.Imag(z),
Complex.Real(c),
Complex.Imag(c),
iter};
return result;
}
}
Bauen diese DLL verwende ich "Build" - Befehl über die Visual-Studio-2010-Projekt, das nur enthält diese Datei und einen Verweis auf "Karlstools", ein Modul, das mir erlaubt die Verwendung komplexer zahlen.
Ich weiß nicht warum, aber wenn ich versuche zu laufen, meine Python-code, ist es nur eine exception wirft:
[...]
array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)
File "C:\Python32\lib\ctypes\__init__.py", line 353, in __getattr__
func = self.__getitem__(name)
File "C:\Python32\lib\ctypes\__init__.py", line 358, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Program' not found
Ich brauche Hilfe mit diesem, da es hält, warf mich Ausnahmen auch mit allem, was festgelegt ist public
und die Funktion als static
oder auch, wenn wenn ich versuche, auf die Funktion direkt ohne die Angabe der "Programm" - Klasse... ich habe keine Ahnung, wo das problem sein könnte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Tipps finden Sie über den Aufruf der DLL aus Python mit ctypes verlassen die meisten der Zeit, zu der DLL, geschrieben in C oder C++, nicht C#. Mit C# - Sie ziehen in die ganze Maschinerie, die CLR, und die Symbole sind wahrscheinlich entstellt und nicht das, was ctypes erwarten, und Sie werden alle Arten von Schwierigkeiten, die aus dem Müll-Sammlung-Ausgabe-array.
Ich hatte sehr guten Erfolg, wenn er eine Schnittstelle python-und C# - code durch die Verwendung von python für dot net (http://pythonnet.sf.net), möchten Sie vielleicht, dieses zu versuchen.
Auf der anderen Seite, wenn Sie in pure Leistung betrachten Sie den code so umschreiben, wie eine native C-Erweiterung für Python unter Verwendung der Python/C-API (http://docs.python.org/c-api/).
Es ist eigentlich ziemlich einfach. Nur NuGet hinzufügen "UnmanagedExports" - Paket auf Ihren .Net-Projekt. Sehen https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports für details.
Können Sie dann direkt exportieren, ohne dass man einen COM-Schicht. Hier ist das Beispiel für C# - code:
Können Sie dann laden Sie die dll und rufen Sie die verfügbar gemachten Methoden in Python (Werke für 2.7)
Andere haben darauf hingewiesen, dass eine C# - DLL nicht in der gleichen Weise behandelt wie eine native DLL.
Eine option, die Sie haben, ist der export des C# - Funktionen als COM-Objekt, das leicht verzehrt durch Python.
Persönlich würde ich prüfen, einen native-code-Lösung, aber Sie kann gut sein, sich zu stark auf C# um den Kurs zu ändern, in diesem Stadium.
ctypes
ist für das laden von shared libraries, die in C geschrieben (oder zumindest die shared-libraries, die direkt ausführbar ist, durch die CPU und den export Ihrer Symbole und Funktion Argumente folgt standard C Konventionen.) C# - DLLs sind nicht "normale" DLLs, sondern soll in eine .NET-Umgebung.Ihre Optionen sind:
ctypes
um die Funktion aufzurufen und die Daten zu verarbeiten Konvertierungen.Ich kann nicht sprechen für option #1, ich habe es nicht getan. Möglichkeit #2 ist in der Regel einfacher als die option #3, in die du reinschreibst C-code und kleben es mit
ctypes
. Option #3 bieten die beste Leistung von allen drei Optionen hat es die niedrigsten call-overhead und ausgeführt wird, nativen code auf dem Prozessor.Einer C# - DLL ist wirklich bezeichnet, als eine Baugruppe, so ist es ganz anders.
Es sei denn, es ist ein sehr wichtiger Grund, warum ich schlage vor, Sie verwenden C++