Compilation de python comprenant du .Net [Résolu/Fermé]

Signaler
-
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
-
Bonjour,

depuis quelques temps je développe quelques applications en python. Je veux distribuer mes applications sans avoir besoin de faire une installation de Python sur chaque ordinateur et ne pas avoir la possibilité de me faire voler mon code.

J'ai regarder quelques alternatives, soit py2exe, pyinstaller et la fonction de compilation de IronPython. Le hic c'est que j'ai plusieurs librairies (DLL) écrites en .Net dont j'ai besoin en plus d'utiliser en plus des modules de base de Python.

Pour l'utilisation du .Net j'ai essayer Python for .Net et IronPython. j'aime un peu mieux Python for .Net car il peut s'intégrer à une version de Python tandis que IronPython est seul. IronPython doit aussi avoir d'ajouter les librairies de base de Python soit avec le fichier suite.py ou un copiant toutes les librairies. c'est un peu moins intéressant, mais bon...

J'ai bien aimé utiliser py2exe, ça marchait bien. Mais PyInstaller est plus intéressant... l'option de compilation de IronPython marche bien quand je veux utiliser seulement des classes .Net, mais dès que je veux utiliser des librairies de python, j'ai une erreur à l'exécution. Pour les deux autres, c'est le contraire... avec les librairies standard de python, tout est ok, mais avec le .Net... des erreurs à l'exécution.
Dès que je compile, j'ai une erreur disant que l'exécutable ne peut loader le Python.runtime, donc je le copie dans le répertoire et ensuit e j'ai une erreur :
Exception non gèrée, System.AccessViolationException : Tentative de lecture ou d'écriture de mémoire protégée [...] dans
Python.Runtime.RuntimePyObject_SetAttrString(...)
Python.Runtime.Exceptions.SetupExcetionJack()
Python.Runtime.Exceptions.Initialize()
Python.Runtime.Runtime.Initialize()
Python.Runtime.PythonEngine.InitExt()
CLRModule.initCLR()


Ma question est la suivante : J'aimerais pouvoir compiler mes scripts qui utilisent autant des librairies de python et des classes de .Net.
Peut-être ai-je fais quelques chose d'incorrect, je ne sais pas ... Peut-être avez-vous déjà réussis à faire ce que je veux faire, de quelle manière avez-vous fait ?? Je n'ai pas de solution préférée, tant que ça marche!!

Merci

3 réponses

Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 533
Hello.
Désolé je n'ai jamais essayé de mêler Python et .Net, je ne pourrai donc pas t'aider sur ce point.

Bon ... finalement j'ai trouvé solution à mon problème !!! :D
En fouillant un peu, et ré-utiliser ce que j'avais déjà fait, et j'ai finlament réussi. J'ai même trouvé 2 solutions.

En lisant un peu plus sur IronPython, j'ai vu qu'on pouvait compiler avec une seule commande :
IronPythonConsole -X:SaveAssemblie scriptPython.py

Ayant déjà copier toutes les librairies du CPython dans le dossier lib de ironPython. Il va créer l'exécutable ScriptPython.exe sans erreur. Par contre, en l'exécutant j'obtenait une erreur. En vérifiant, j'ai remarquer que cette même commande compilait aussi les fichiers os.py et autres nécessaires en exécutable. Donc, en mettant tous les exécutables dans le même répertoire, c'étais correct,

Lisant encore une fois, je remarque que l'équipe d'IronPython ne reocmmande pas l'utilisation de cette commande mais plutôt les modules de compilateur. J'ai trouvé un script qui permet de faire la compilation :

--makeexe--

__doc__ = '''
Create an IronPython Windows application (No Console) executable from one
or more python source files.

ipy.exe makeexe.py source1 [source2....] executable_name

For example:

ipy.exe makeexe.py hello.py hello.exe

The first file in the source file argument list must contain the main logic.
'''
__version__ = "$Revision$"[11:-1]
import sys
from IronPython.Hosting import PythonCompiler
from System.Reflection.Emit import PEFileKinds

if sys.argv[1] == "--help":
print __doc__
sys.exit(0)

from System.Collections.Generic import List
sources = List[str]()

for file in sys.argv[1:-1]:
sources.Add(file)
exename = sys.argv[-1]

compiler = PythonCompiler(sources, exename)
compiler.MainFile = sys.argv[1]
#compiler.TargetKind = PEFileKinds.WindowApplication
#compiler.IncludeDebugInformation = False
compiler.Compile()


et s'utilise de cette façon :
ipy.exe makeexe scriptPrincipal [autres script] nomExecutable.exe

en ajoutant le path de tous les fichiers .py des modules, il créer un seul exécutable qui marche.

aussi, en enlevant les deux commentaires à la fin, j'ai aucun debug info et je créer un windows app (donc aucune fenêtre de commande)


voilà!!
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 533
Merci d'avoir posté la solution !