Suite

Ctypes : bridge en Python pour une dll

Ctypes : bridge en Python pour une dll


J'ai une dll et j'aimerais l'appeler en Python. La dll a besoin de quelques paramètres.

Savez-vous passer un paramètre de bouton radio et un paramètre de case à cocher ?


Je suppose que vous entendez par votre question que votre outil Arc a un paramètre de bouton radio et de case à cocher dans l'interface (plutôt que « bouton radio » et « case à cocher » étant des types natifs dans la langue dans laquelle vous écrivez la DLL).

Donc, avez-vous vraiment besoin de votre DLL pour savoir de quelle saveur d'élément d'interface utilisateur provient le paramètre, ou serait-il préférable que la DLL ne sache pas comment elle a été appelée et qu'elle effectue simplement le calcul ?

Les cases à cocher passent d'arc à python sous forme de booléens. Boutons radio - Je ne savais pas que vous pouviez les faire, je pensais que vous deviez utiliser une chaîne avec un filtre d'entrée. Jouez avec la boîte de dialogue des propriétés de l'outil pour y parvenir ; créez vos paramètres, sélectionnez le paramètre de chaîne, puis cliquez sur le '…' après 'Filtre' vous permettra d'entrer les valeurs que vous voulez disponibles.

Puis en python :

# appel dll pour répondre à la préférence de couleur de l'utilisateur (à partir du bouton radio) # selon qu'il est sous l'eau ou non (déduit de la case à cocher) user_is_underwater = arcpy.GetParameter(0) favorite_colour = arcpy.GetParameterAsText(1) dll = ctypes.windll .LoadLibrary("mydllname.dll") dll.dostuff(user_is_underwater,favourite_colour)

Les Ctypes seront automatiquement convertiscouleur préféréeà un caractère de style C*. Donc si votre dll est écrite en C++ elle devra définir

extern "C" __declspec(dllexport) void __stdcall dostuff(bool user_is_underwater, char* favorite_colour) { //faites vos trucs ici, en incluant éventuellement des tests comme if (strcmp(favourite_colour,"RED"))… }

Je suppose que vous aurez d'autres paramètres et que vous devrez peut-être également utiliser des ctypes pour définir un type de retour pour dll.run, s'il en a un.

Alternativement, convertissez vos chaînes en entiers dans le python, par ex.

favorite_colour = ctypes.c_int(['RED','GREEN'].index(arcpy.GetParameterAsText(1))

et les transmettre à la dll sous forme d'entiers ; bien que vous deviez ensuite synchroniser trois représentations : la boîte de dialogue des paramètres de script, cette liste dans le python et une énumération correspondante dans le C.


Voir la vidéo: ctypes made easy