Question

Salut je sais comment faire de la bibliothèque (DLL) dans Windows avec Visual Studio 2012 avec C ++ et importation en python avec ctypes fonctionne très bien

ici petit exemple

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

lib.h

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

J'essaye d'exécuter le même code dans Mac avec Xcode 4.4 version lorsque je me blad dans xcode j'obtiens un message en guerre

__declspec attribute 'dllexport' is not supported

Et quand importer lib.dylib en python, j'obtiens une erreur

AttributeError: dlsym(0x101afba30, sum): symbol not found

Ce que je fais mal ? quelqu'un peut-il écrire du code simple comment je peux faire un dylib dans Mac avec Xcode correct à importer avec CTYPES dans Python 2.6.4

OU

La meilleure façon d'importer des libaires dans Python dans les deux systèmes pour Mac et Win?

Basique j'aime écrire du code dans Windows avec Visual Studio 2012 Faire DLL I puis un compilateur simple dans Mac avec Xcode et importer dans Python

Était-ce utile?

La solution

Votre problème était que vous aviez déjà le dylib chargé dans votre interprète Python. Le simple fait de la reconstruire n'affectera pas ce que vous avez chargé dans la mémoire.

Faire juste un autre LoadLibrary Peut ou non recharger la bibliothèque, et il n'y a aucun moyen de le forcer à le faire.

Il n'y a pas non plus de moyen de décharger et de recharger les bibliothèques dans ctypes. La raison principale est qu'il n'y a pas de moyen sûr de le faire sur toutes les plateformes - en fait, avant 10.4, OS X lui-même était une telle plate-forme. (Et Python a encore Code source actuel dans l'arbre Pour prendre en charge la pré-10,4 OS X ctypes.) Mais aussi, essayer de proposer un modèle qui fait les choses de la manière sûre sur chaque plate-forme n'est pas exactement triviale. Alors, ctypes n'essaie pas.

Si vous avez vraiment besoin de le faire, le _ctypes module en dessous ctypes Exporte généralement les fonctions nécessaires dans Python. Si vous connaissez les noms de votre plateforme, vous pouvez les trouver avec help(_ctypes), ou en regardant la source.

En bref, sur la plupart des plateformes POSIX modernes (y compris OS X 10.5+) _ctypes.dlclose(mydll._handle), pendant que sur win32, c'est _ctypes.FreeLibrary(mydll._handle). Dans les deux cas, si vous utilisez jamais mydll Encore une fois (ou toutes les fonctions ou valeurs que vous en référiez), vous devriez prier pour une segfault. Vous pouvez également Segfault à la sortie. Et sur Windows, il peut ne pas libérer la bibliothèque lorsque vous le demandez, et dans certains cas, vous devez demander à la bibliothèque si elle est prête à décharger avant de le faire, et il y a des complexités de filetage, et… eh bien, lisez simplement la FreeLibrary docs sur msdn, et bien sûr la page manuelle pour dlclose(3) sur chaque système POSIX qui vous tient à cœur.

En général, c'est une bien meilleure idée de simplement démarrer un nouveau processus d'interprète à la place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top