Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Déployer un script python en incluant les dépendances vers des bibliothèques n on standards

15 réponses
Avatar
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

styles = getSampleStyleSheet()

story = []

texte = "Blabla blabla. " * 40


story.append(Paragraph(texte, styles["Normal"]))
story.append(Spacer(0, 0.5 *cm))
story.append(Paragraph(texte, styles["Normal"]))


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.



--
François Lafont

5 réponses

1 2
Avatar
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 :

cxfreeze --include-modules "reportlab.pdfbase_fontdata_widths_courier,
reportlab.pdfbase._fontdata_widths_courierbold, ETC..." MonScript.py

C'est ça ? Ou je n'ai pas compris.


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
Avatar
Alain Ketterlin
Francois Lafont writes:

D'abord, si j'ai bien compris, il est impossible de faire de la
cross-compilation (ex: compilation sur Debian pour obtenir un .exe
windows) et obtenir un exécutable standalone pour la plate-forme cib le,
ne nécessitant même pas l'installation de l'interpréteur P ython.



Oui, enfin, c'est quand même pas pour les premiers communiants. Mà ªme si
le compilateur peut générer du code pour une autre archi, il faut
s'assurer le cohérence de l'ensemble (archi, libs, etc.) Je ne crois p as
que ça ait déjà été fait pour python.

cx_freeze permet ce genre de compilations mais la plate-forme de
compilation et la plate-forme cible doivent être identiques.



cx_freeze ne compile rien du tout (peut-être des sources .py en .pyc).
Il crée un gros paquets contenant tout ce qui est nécessaire :
l'interpréteur, les bibliothèques (.so sous linux, .dll sous Wind ows),
et tous les .pyc qu'il faut. L'interpréteur et les bibliothèques sont
spécifiques au système, les .pyc ne le sont pas.

Q1) Est-ce juste ?



Oui, mais ne te fais pas trop d'illusions. La cross-compilation c'est
compliqué. Les outils comme cx_freeze n'ont pas le pouvoir de faire des
miracles (il faudrait les sources de l'interpréteur et toutes les
dépendances). Il se contente de rassembler les morceaux, et ce n'est
déjà pas simple.

En revanche, d'après ce que j'ai compris des indications d'Alain, il est
possible de créer une sorte de .zip contenant tout le code python
nécessaire à une appli et pouvant fonctionner sur n'importe que lle
plate-forme pourvu que l'interpréteur Python y soit installé en amont.



Oui, et en fait c'est presque la même chose que quand il génà ¨re un
fichier standalone, sauf que dans ce dernier cas il range l'intepréteur
et library.zip dans le même fichier. (Si j'en crois la "doc" de
cx_freeze.)

[...]
python setup.py build_exe --create-shared-zip


[...]
Q2) Est-ce comme cela qu'il faut s'y prendre ? En vérité, j'ai un doute
car j'ai testé ce procédé sur exemple un peu plus gros que l'exemple
donné ici et j'obtiens alors une erreur sous Win (et pas sous Debian ).



Oui, c'est bien ça.

Mais là encore, reportlab c'est compliqué : il utilise une biblio thèque
spécialisée (optionnelle) pour accélérer la génà ©ration de PDF.
L'installation de reportlab nécessite un compilateur C. La version que
tu mets dans le paquet sur Debian utilise sûrement cette bibliothà ¨que.
Et cette bibliothèque n'est pas utilisable sous Windows, il en faut une
version spécifique. Contrairement à ce qu'ils clament, reportlab n'est
pas "pur python". C'est le problème que tu as. Une solution serait de
s'assurer que reportlab fait tout en python. J'ignore si c'est possible,
mais il est certain que ça va beaucoup ralentir.

Au passage, avec ce procédé, il fallait que j'utilise la mà ªme version
d'interpréteur (sur Win et Linux), sinon j'ai des erreurs. Mais à §a, je
trouve que c'est logique.



La version de l'interpréteur est écrite dans les fichiers .pyc, e t la
compatibilité n'est qu'ascendante.


Je me demande si au final tu ne vas pas te rendre compte qu'il est plus
simple d'installer python (et reportlab etc.) que d'essayer de créer u ne
distribution multi-architectures de ton appli. Techniquement je suis
convaincu que c'est beaucoup plus simple, mais tu as sûrement d'autres
contraintes.

-- Alain.
Avatar
Laurent Pointal
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).

A+
Avatar
Laurent Pointal
Laurent Pointal wrote:

Et un tableau comparatif de différents outils:



https://spreadsheets.google.com/pub?key=tZ42hjaRunvkObFq0bKxVdg&output=html

J'ai trouvé le tableau via ce lien:
http://www.velocityreviews.com/forums/t704047-comparing-alternatives-to-
py2exe.html
Avatar
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
1 2