2009-02-15 10 views
11

Existe-t-il un moyen d'utiliser py2exe ou une autre méthode pour générer des fichiers dll au lieu de fichiers exe? Je voudrais créer une DLL win32 normale avec des fonctions normales, mais ces fonctions seraient codées en python au lieu de C++.py2exe pour générer des DLL?

Répondre

6

Je pense que vous pouvez résoudre ce problème en faisant quelques bidouillages:

  • Jetez un oeil sur le module zipextimporter dans py2exe. Il aide à l'importation de fichiers pyd à partir d'un zip. En utilisant cela, vous pourrez peut-être charger le fichier de sortie de py2exe dans votre propre app/dll en utilisant python-api. (Utilisez boost :: python si vous le pouvez et vous voulez)
  • Etant donné que le fichier de sortie de py2exe est un fichier zip, vous pouvez l'attacher à la fin de votre DLL, ce qui rend l'ensemble encore plus intégré. (Vieux truc qui fonctionne aussi avec les fichiers jar.)

Non testé, mais je pense que la théorie est solide. Pour l'essentiel, vous réimplémentez le fichier main() de l'exécutable de sortie de py2exe dans votre DLL.

+0

py2exe a 1 chemin de sortie de code, le principal(). Avez-vous des idées sur un moyen de spécifier les fonctions/classes exportées avec du code python uniquement? En supposant que j'ai fait une sorte d'utilitaire similaire py2dll –

+0

Non. Je ne pense pas que vous pouvez le faire sans écrire quelques C.Je pensais que vous lanceriez py2exe comme d'habitude, et utiliserais sa sortie de bibliothèque, mais codez votre propre DLL, qui exporte une fonction 'my_pymain' qui fait quelque chose de similaire aux exécutables de py2exe. Vous devriez être capable de voler ce code de py2exe. – Macke

4

Je ne suis pas au courant que py2exe est capable de le faire, car je pense qu'il ne fait pas de symboles d'objets de votre code Python, mais qu'il incorpore juste le code octet compilé dans un exécutable avec l'exécution Python).

La création d'une bibliothèque native peut nécessiter un peu plus de travail (pour définir l'interface C/C++) avec l'API Python-C. Il peut être plus facile d'utiliser Elmer pour cela.

5

Je doute que py2exe le fasse, car il est structuré autour d'un .exe d'amorçage qui déploie l'interpréteur python et l'exécute.

Mais pourquoi ne pas simplement intégrer Python dans le code C et compiler ce code en tant que DLL?

0

On dirait qu'il est possible de générer une DLL COM à partir py2exe:

http://www.py2exe.org/index.cgi/Py2exeAndCtypesComDllServer

23  my_com_server_target = Target(
    24  description = "my com server", 
    25  # use module name for ctypes.com dll server 
    26  modules = ["dir.my_com_server"], 
    27  # the following line embeds the typelib within the dll 
    28  other_resources = [("TYPELIB", 1, open(r"dir\my_com_server.tlb", "rb").read())], 
    29  # we only want the inproc (dll) server 
    30  create_exe = False 
    31 ) 
1

Pour la postérité, j'ai pu utiliser Elmer pour générer avec succès une DLL utilisable récemment. Leur site has an example of building a DLL wrapper that loads python code. C'est plutôt cool parce que vous pouvez changer le code python à la volée pour changer le comportement de la DLL pour le débogage. Malheureusement, pour ma part, je voulais une DLL portable qui fonctionnerait sans installer Python. Cette partie n'a pas fonctionné tout à fait hors de la boîte. Plutôt que de répéter toutes les étapes, voici un lien vers la réponse avec les étapes que j'ai suivies: https://stackoverflow.com/a/24811840/3841168. J'ai dû distribuer python27.dll, elmer.dll et un couple de .pyd avec mon .dll; Un .net runtime approprié était également nécessaire puisque le python27.dll n'est généralement pas lié statiquement. Il peut y avoir un moyen de contourner le problème, y compris un chargement de dll, mais cela ne me dérange pas de distribuer plusieurs DLL, donc je n'ai pas trop creusé dedans.

Questions connexes