À l'aide de ctypes en python pour accéder à un C# dll méthodes
Je tiens à mettre en œuvre le code C# dans une partie essentielle de mon programme en python pour le rendre plus rapide. Il dit (à la documentation Python et ce site) que vous pouvez charger une Bibliothèque de liens Dynamiques (et donc, dire que le PyDocs) comme suit:
cdll.LoadLibrary("your-dll-goes-here.dll")
C'est la partie de mon code qui prend en charge cette fonctionnalité:
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]))
Et la RECERCATOOLS.dll que j'utilise est la suivante (code C#, C ou 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;
}
}
Pour construire cette DLL d'utilisation de la "construction" de la commande sur le projet Visual Studio 2010, qui contient ce fichier et une référence à "Karlstools", un module qui me permet d'utiliser les nombres complexes.
Je ne sais pas pourquoi, mais lorsque j'essaie d'exécuter mon code Python, c'est juste déclenche une exception:
[...]
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
J'ai besoin d'aide à cet égard, car il garde en me jetant des exceptions, même avec tout est mis à public
et la fonction comme static
, ou même si j'essaie d'accéder à la fonction directement, sans préciser le "Programme" de la classe... je n'ai aucune idée d'où le problème pourrait être.
OriginalL'auteur Daniel Torramilans | 2011-07-16
Vous devez vous connecter pour publier un commentaire.
Les conseils que vous trouverez concernant l'appel de DLL à partir de Python à l'aide de ctypes s'appuient la plupart du temps à la DLL écrite en C ou C++, C#. Avec C# vous tirez dans l'ensemble du mécanisme de la CLR, et les symboles sont les plus susceptibles de déformation et non pas ce ctypes attendre, et vous obtiendrez toutes sortes de troubles de la collecte des déchets de votre tableau de sortie.
J'ai eu de très bons résultats lors de l'interfaçage python et C# code par l'utilisation de python pour dot net (http://pythonnet.sf.net), vous pouvez essayer cette.
D'autre part, si vous êtes dans la performance pure, envisager de réécrire votre code natif C extension de Python à l'aide de l'Python/C de l'API (http://docs.python.org/c-api/).
OriginalL'auteur gurney alex
Il est en fait assez facile. Utilisez simplement NuGet pour ajouter le "UnmanagedExports" paquet .Un projet de réseau. Voir https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports pour plus de détails.
Vous pouvez ensuite exporter directement, sans avoir à faire une couche COM. Voici un exemple de code C#:
Vous pouvez ensuite charger la dll et appeler les méthodes exposées dans Python (pour les 2.7)
OriginalL'auteur Rob Deary
D'autres ont souligné que les C# DLL ne peut pas être traitée de la même manière qu'une DLL native.
Une option que vous avez est d'exporter votre fonctionnalité C# comme un objet COM qui peut être facilement consommé par Python.
Personnellement, je voudrais examiner un code natif solution mais vous pouvez très bien être trop engagé à C# pour changer de cap à ce stade.
OriginalL'auteur David Heffernan
ctypes
est pour le chargement des bibliothèques partagées à l'écrit en C (ou au moins les bibliothèques partagées qui sont directement exécutable par le PROCESSEUR et l'exportation de leurs symboles et des arguments de la fonction à la suite de la norme C conventions.) C# Dll ne sont pas "normales" Dll, mais plutôt destiné à s'exécuter dans une .NET de l'environnement.Vos options sont:
ctypes
à l'appel de la fonction et de gérer les conversions de données.Je ne peux pas parler pour l'option #1, je ne l'ai pas fait. Option #2 est généralement plus facile que l'option n ° 3 dans ce que vous écrivez pur C code et le coller dans avec
ctypes
. Option #3 offre la meilleure performance de tous les trois options en qui il a le plus faible temps système de l'appel et l'exécution de code natif sur le processeur.OriginalL'auteur Mark Evans
Un C# DLL est vraiment appelé à une Assemblée de sorte qu'il est tout à fait différent.
À moins qu'il y est une raison très importante, je vous suggère d'utiliser C++
OriginalL'auteur Keith Kenny