2010-11-02 36 views
3

J'ai ce code C++ qui montre comment étendre un logiciel en compilant à une DLL et de le mettre dans le dossier de l'application:Utiliser Cython pour exposer la fonctionnalité à une autre application

#include <windows.h> 

#include <DemoPlugin.h> 

/** A helper function to convert a char array into a 
    LPBYTE array. */ 
LPBYTE message(const char* message, long* pLen) 
{ 
    size_t length = strlen(message); 
    LPBYTE mem = (LPBYTE) GlobalAlloc(GPTR, length + 1); 
    for (unsigned int i = 0; i < length; i++) 
    { 
    mem[i] = message[i]; 
    } 
    *pLen = length + 1; 
    return mem; 
} 

long __stdcall Execute(char* pMethodName, char* pParams, 
    char** ppBuffer, long* pBuffSize, long* pBuffType) 
{ 
    *pBuffType = 1; 

    if (strcmp(pMethodName, "") == 0) 
    { 
    *ppBuffer = (char*) message("Hello, World!", 
    pBuffSize); 
    } 
    else if (strcmp(pMethodName, "Count") == 0) 
    { 
    char buffer[1024]; 
    int length = strlen(pParams); 
    *ppBuffer = (char*) message(itoa(length, buffer, 10), 
    pBuffSize); 
    } 
    else 
    { 
    *ppBuffer = (char*) message("Incorrect usage.", 
    pBuffSize); 
    } 

    return 0; 
} 

Est-il possible de faire un plugin de cette façon en utilisant Cython? Ou même py2exe? La DLL doit juste avoir un point d'entrée, n'est-ce pas?

Ou devrais-je simplement le compiler nativement et intégrer Python en utilisant elmer?

Répondre

3

Je pense que la solution est d'utiliser les deux. Laisse-moi expliquer. Cython permet de faire un plugin rapide en utilisant python mais pas pratique (si possible) de faire le bon "type" de DLL. Vous devrez probablement utiliser le mode autonome de sorte que le runtime python nécessaire soit inclus et que vous utilisiez le code c généré pour qu'une DLL appropriée soit compilée. Inversement, elmer rend pratique la création de la DLL mais exécute un code python "pur" qui peut ne pas être assez rapide. Je suppose que la vitesse est un problème parce que vous envisagez le cython par opposition à la simple intégration.

Ma suggestion est la suivante: le code pur python qu'elmer exécute devrait importer une extension standard de Cython python et y exécuter du code. De cette façon, vous n'avez pas besoin de pirater quoi que ce soit et vous avez le meilleur des deux mondes.


Une autre solution à envisager est d'utiliser shedskin, car de cette façon vous pouvez obtenir C++ code à partir de votre code python qui est indépendant de l'exécution de python.