Déployer un script python en incluant les dépendances vers des bibliothèques n on standards
15 réponses
Francois Lafont
Bonjour à tous,
Je pense que ma question est un problème assez classique mais 1) je n'ai
pas réussi à trouver des explications claires et 2) je suis très loin
d'être un expert python.
Par exemple, je veux déployer cette "application" (elle crée juste un
fichier pdf avec écrit "blabla" dedans) :
#---------------------------------
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
pdf = SimpleDocTemplate('test.pdf', pagesize=A4,
title='Premier Test', author='FL')
pdf.build(story)
#---------------------------------
Mon objectif est le suivant : je voudrais distribuer cette "application"
à d'autre personnes de manière à ce qu'ils aient à faire le minimum au
niveau installation.
L'idéal serait qu'un utilisateur ait seulement à faire ceci :
1. Il installe python sur son système.
2. Il télécharge une archive blablapdf.zip et procède à une extraction.
3. Il va dans le dossier blablapdf et lance un script python du genre
main.py.
Évidemment, si l'application n'utilisait que des modules de la
bibliothèque standard, ce serait facile. Mais là, reportlab est utilisé
et il n'en fait pas partie. Typiquement, je voudrais éviter à
l'utilisateur d'avoir à l'installer par lui-même sur son système. Est-ce
possible et comment ?
Merci d'avance pour votre aide.
PS : je suis sous Debian Squeeze et utilise python version 2.6.6.
La fonction __import__() permet de faire des importations de modules de façon dynamique. C'est ça qui pose problème à cx_freeze car celui-ci ne peut analyser que les import statiques. Les import dynamiques ne sont "vus" par cx_freeze et par conséquent, les modules correspondants ne sont pas ajoutés à l'exécutable.
Ok. Je m'en doutais. :-)
Une solution est effectivement d'importer explicitement les modules qui posent problème. Par contre, il serait préférable de faire ces import dans le script de configuration de cx_freeze. De cette manière, ton soft n'est pas modifié et tu peux en faire un exécutable quand même.
Je vois à peu près ce que tu veux dire, sauf que je ne vois pas trop ce que tu veux dire quand tu parles de « script de configuration de cx_freeze ». Tu veux dire qu'au lieu de faire « cxfreeze MonScript.py », il faut que je tape un truc dans le genre :
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par contre j'ai déjà utilisé py2exe et j'ai considéré que les deux fonctionnent de la même façon. Avec py2exe, j'écris un script de configuration indépendant de mon application. Je passe ce script en paramètre à py2exe qui fait ce qui est demandé dans le script. Dans le script de configuration, il est indiqué entre autres : - Nom du script principal de l'application. - Nom du fichier icone associé à l'application. - Noms des fichiers supplémentaires nécessaires à l'application (icone, images...) - Noms des dlls système nécessaires à l'exécution du résultat. - ... Il est également possible de rajouter un peu de sauce pour générer un exécutable unique d'installation via InnoSetup.
En tout cas, merci Nicolas, car cx_freeze est une découverte bien sympathique pour moi.
C'est en effet fort utile dans certins cas.
Nicolas
Le 02/09/2011 22:49, Francois Lafont a écrit :
Le 02/09/2011 08:35, Nicolas a écrit :
La fonction __import__() permet de faire des importations de modules de
façon dynamique.
C'est ça qui pose problème à cx_freeze car celui-ci ne peut analyser que
les import statiques. Les import dynamiques ne sont "vus" par cx_freeze
et par conséquent, les modules correspondants ne sont pas ajoutés à
l'exécutable.
Ok. Je m'en doutais. :-)
Une solution est effectivement d'importer explicitement les modules qui
posent problème. Par contre, il serait préférable de faire ces import
dans le script de configuration de cx_freeze. De cette manière, ton soft
n'est pas modifié et tu peux en faire un exécutable quand même.
Je vois à peu près ce que tu veux dire, sauf que je ne vois pas trop ce
que tu veux dire quand tu parles de « script de configuration de
cx_freeze ». Tu veux dire qu'au lieu de faire « cxfreeze MonScript.py »,
il faut que je tape un truc dans le genre :
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par
contre j'ai déjà utilisé py2exe et j'ai considéré que les deux
fonctionnent de la même façon.
Avec py2exe, j'écris un script de configuration indépendant de mon
application. Je passe ce script en paramètre à py2exe qui fait ce qui
est demandé dans le script.
Dans le script de configuration, il est indiqué entre autres :
- Nom du script principal de l'application.
- Nom du fichier icone associé à l'application.
- Noms des fichiers supplémentaires nécessaires à l'application (icone,
images...)
- Noms des dlls système nécessaires à l'exécution du résultat.
- ...
Il est également possible de rajouter un peu de sauce pour générer un
exécutable unique d'installation via InnoSetup.
En tout cas, merci Nicolas, car cx_freeze est une découverte bien
sympathique pour moi.
La fonction __import__() permet de faire des importations de modules de façon dynamique. C'est ça qui pose problème à cx_freeze car celui-ci ne peut analyser que les import statiques. Les import dynamiques ne sont "vus" par cx_freeze et par conséquent, les modules correspondants ne sont pas ajoutés à l'exécutable.
Ok. Je m'en doutais. :-)
Une solution est effectivement d'importer explicitement les modules qui posent problème. Par contre, il serait préférable de faire ces import dans le script de configuration de cx_freeze. De cette manière, ton soft n'est pas modifié et tu peux en faire un exécutable quand même.
Je vois à peu près ce que tu veux dire, sauf que je ne vois pas trop ce que tu veux dire quand tu parles de « script de configuration de cx_freeze ». Tu veux dire qu'au lieu de faire « cxfreeze MonScript.py », il faut que je tape un truc dans le genre :
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par contre j'ai déjà utilisé py2exe et j'ai considéré que les deux fonctionnent de la même façon. Avec py2exe, j'écris un script de configuration indépendant de mon application. Je passe ce script en paramètre à py2exe qui fait ce qui est demandé dans le script. Dans le script de configuration, il est indiqué entre autres : - Nom du script principal de l'application. - Nom du fichier icone associé à l'application. - Noms des fichiers supplémentaires nécessaires à l'application (icone, images...) - Noms des dlls système nécessaires à l'exécution du résultat. - ... Il est également possible de rajouter un peu de sauce pour générer un exécutable unique d'installation via InnoSetup.
En tout cas, merci Nicolas, car cx_freeze est une découverte bien sympathique pour moi.
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par contre j'ai déjà utilisé py2exe et j'ai considéré que les deux fonctionnent de la même façon.
</zip>
A noter, py2app pour MacOSX
http://pypi.python.org/pypi/py2app/
Et un tableau comparatif de différents outils: https://spreadsheets.google.com/pub?key=tZ42hjaRunvkObFq0bKxVdg&output=html
Perso j'ai utilisé PyInstaller pour un packaging sous Windows (après avoir échoué avec py2exe pour je ne sais plus quelle raison).
A+
Nicolas wrote:
<zip>
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par
contre j'ai déjà utilisé py2exe et j'ai considéré que les deux
fonctionnent de la même façon.
</zip>
A noter, py2app pour MacOSX
http://pypi.python.org/pypi/py2app/
Et un tableau comparatif de différents outils:
https://spreadsheets.google.com/pub?key=tZ42hjaRunvkObFq0bKxVdg&output=html
Perso j'ai utilisé PyInstaller pour un packaging sous Windows (après avoir
échoué avec py2exe pour je ne sais plus quelle raison).
J'ai peut-être dit une bêtise. Je n'ai jamais utilisé cx_freeze. Par contre j'ai déjà utilisé py2exe et j'ai considéré que les deux fonctionnent de la même façon.
</zip>
A noter, py2app pour MacOSX
http://pypi.python.org/pypi/py2app/
Et un tableau comparatif de différents outils: https://spreadsheets.google.com/pub?key=tZ42hjaRunvkObFq0bKxVdg&output=html
Perso j'ai utilisé PyInstaller pour un packaging sous Windows (après avoir échoué avec py2exe pour je ne sais plus quelle raison).
J'ai trouvé le tableau via ce lien: http://www.velocityreviews.com/forums/t704047-comparing-alternatives-to- py2exe.html
Francois Lafont
Merci à tous pour votre aide.
Je vais oublier la cross-compilation (enfin le cross-empaquetage ;-) car effectivement ce n'est pas une compilation), ce qui ne m'empêche pas de trouver ce cx_freeze fort pratique.
À+
-- François Lafont
Merci à tous pour votre aide.
Je vais oublier la cross-compilation (enfin le cross-empaquetage ;-) car
effectivement ce n'est pas une compilation), ce qui ne m'empêche pas de
trouver ce cx_freeze fort pratique.
Je vais oublier la cross-compilation (enfin le cross-empaquetage ;-) car effectivement ce n'est pas une compilation), ce qui ne m'empêche pas de trouver ce cx_freeze fort pratique.