web-dev-qa-db-fra.com

Comment compiler un paquet Python en une dll

Eh bien, j'ai un paquet Python. Je dois le compiler en tant que dll avant de le distribuer de manière facilement importable. Comment? Vous pouvez suggérer que *.pyc. Mais je lis quelque part que n'importe quel *.pyc peut être facilement décompilé!

Mise à jour: Suivez ces instructions:
1) J'ai écrit un paquet python
2) veux le distribuer
3) NE veulent PAS distribuer la source
4) * .pyc est décompilable >> la source peut être extraite!
5) dll est standard 

16
Developer

Ecrivez tout ce que vous voulez cacher en Cython et compilez-le en pyd C'est aussi proche que possible de la création de code python compilé. 

En outre, la DLL n'est pas un standard, pas dans le monde Python. Ils ne sont pas portables non plus.

8
Kien Truong

Vous pouvez intégrer du python dans C . Le vrai truc consiste à convertir entre les valeurs C et les valeurs Python. Cependant, une fois que vous avez terminé, créer une DLL est assez simple .

Cependant, pourquoi avez-vous besoin de créer une dll? Avez-vous besoin de l'utiliser depuis un programme non-python?

5
Nick ODell

Vous pouvez utiliser py2exe.org pour convertir les scripts python en exécutables Windows. Certes, cela ne fonctionnera que sous Windows, mais c'est mieux que rien.

5
jb.

Je voudrais aussi utiliser Cython pour générer des fichiers pyd, comme Dikei l’a écrit. Mais si vous voulez vraiment sécuriser votre code, mieux vaut écrire les éléments importants en C++. Le mieux serait de combiner C++ et Python. L'idée: vous laisseriez le code python ouvert pour des ajustements, de sorte que vous n'ayez pas à tout compiler encore et encore. Cela signifie que vous écririez le "noyau" en C++ (qui est la solution la plus sécurisée de nos jours) et utilisiez ces fichiers dll dans votre code python. Cela dépend vraiment du type d’outil ou de programme que vous construisez et de la façon dont vous voulez l’exécuter. Je crée principalement un fichier d'exécution (exe, app) une fois que je termine un outil ou un programme, mais cela concerne davantage l'utilisateur final. Cela pourrait être fait avec py2exe et py2app (tous deux compatibles 64 bits). Si vous implémentez l'interpréteur, il n'est pas nécessaire que python soit installé sur le système de l'utilisateur final. 

Un fichier pyd est identique à un dll et entièrement pris en charge dans python. Vous pouvez donc normalement importer votre module. Vous pouvez trouver plus d'informations à ce sujet ici

Utiliser et générer des fichiers pyd est le moyen le plus rapide et le plus simple de créer du code python sûr et portable.

Vous pouvez aussi écrire de vrais fichiers dll dans C++ et les importer avec ctypes pour les utiliser (ici un bon post et ici la description python de son fonctionnement)

2
MagSec

Vous pouvez utiliser pyinstaller pour convertir les fichiers .py en fichiers exécutables avec tous les packages requis au format .dll.

Étape 1. pip install pyinstaller, 

étape 2. nouveau fichier python appelons-le code.py. 

étape 3. Ecrivez quelques lignes de code i.e print ("Hello World") 

étape 4. Ouvrez l'invite de commande au même endroit et écrivez pyinstaller code.py appuyez sur entrée. Dernière étape, voyez au même endroit deux dossiers nommés build, dist seront créés. dans le dossier dist, il y a un code de dossier et à l'intérieur de ce dossier, il y a un fichier exe code.exe ainsi que les fichiers .dll requis.

1
Muhammad Adnan

L'incorporation Python est prise en charge dans CFFI version 1.5 , vous pouvez créer un fichier .dll pouvant être utilisé par une application Windows C.

0
Ken Hung

Pour développer la réponse de Nick ODell

Vous devez être sur Windows pour que les DLL fonctionnent, elles ne sont pas portables.

Cependant, le code ci-dessous est multiplateforme et toutes les plates-formes prennent en charge les durées d'exécution. Vous pouvez donc le recompiler pour chaque plate-forme sur laquelle vous souhaitez travailler.

Python ne fournit pas (encore) un outil simple pour créer une dll, mais vous pouvez le faire en C/C++.


Tout d'abord, vous aurez besoin d'un compilateur (Windows n'en a pas par défaut), notamment Cygwin, MinGW ou Visual Studio. 

Une connaissance de base de C est également nécessaire (puisque nous coderons principalement en C).

_ {Vous devrez également inclure les en-têtes nécessaires. Je l'ignorerai pour éviter que cela ne devienne horriblement long, et je supposerai que tout est correctement configuré.


Pour cette démonstration, je vais imprimer un monde traditionnel:

Code Python que nous allons convertir en DLL:

def foo(): print("hello world")

Code C:

#include "Python.h" // Includes everything to use the Python-C API

int foo(void); // Declare foo

int foo(void) { // Name of our function in our DLL

    Py_Initialize(); // Initialise Python

    PyRun_SimpleString("print('hello world')"); // Run the Python commands

    return 0; // Finish execution
}

Voici le tutorial pour intégrer Python. Il y a quelques éléments supplémentaires à ajouter ici, mais par souci de brièveté, je les ai laissés de côté.

Compilez-le et vous devriez avoir une DLL. :)


Ce n'est pas tout. Vous devrez distribuer toutes les dépendances nécessaires, ce qui signifie l'exécution python36.dll et d'autres composants permettant d'exécuter le script Python.

Mon codage C n’est pas parfait. Si quelqu'un peut repérer des améliorations, merci de le commenter et je ferai de mon mieux pour le corriger. 


Cela pourrait également être possible en C # à partir de cette réponse Comment appeler une méthode spécifique à partir d’un script Python en C #? , puisque C # peut créer des DLL et que vous pouvez appeler des fonctions Python à partir de C #.

0
Simon