Page 1 sur 1

[Résolu][Python] Bibliothèque de fonctions dans un document

MessagePublié: 05 Nov 2016 16:56
par jeanmi2403
Bonjour,
Après la résolution de l'utilisation d'une bibliothèque de fonctions, je cherche maintenant à intégrer cette bibliothèque dans un document, de manière à ce que l'utilisateur n'ait pas à bricoler dans son dossier personnel.
Je pensais à créer un dossier pythonpass dans le dossier scripts\python\pythonpath, mais ça aurait été trop facile !
Je ne trouve aucune littérature sur le sujet (ni anglophone, ni francophone..)
Quelqu'un a-t-il un document dur le sujet ?
en attendant je vais essayer de récupérer le chemin du script appelant et l'ajouter au PYTHONPATH, sans grand espoir..
Cordialement et bonne fin de semaine....

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 05 Nov 2016 18:28
par Hubert Lambert
Bonjour Jean-Michel,

Le répertoire "pythonpath" ne fonctionnera pas dans un document car l'url vers ce répertoire est propre à OpenOffice/LibreOffice et ne peut être comprise par python.
Je ne vois pas de solution simple pour utiliser une libraire externe qui serait incorporée à un document.
Le plus simple est encore de placer les fonctions requises directement dans le module qui les utilise (par exemple dans une classe dédiée), même si ce n'est sans doute pas le plus satisfaisant...

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 05 Nov 2016 19:22
par jeanmi2403
Bonsoir Hubert,
Hubert Lambert a écrit:Le répertoire "pythonpath" ne fonctionnera pas dans un document car l'url vers ce répertoire est propre à OpenOffice/LibreOffice et ne peut être comprise par python.
.

Je m'en doutais. Difficile d'accéder à quelque chose d'encapsulé.
Le plus simple est encore de placer les fonctions requises directement dans le module qui les utilise

Par "module", je suppose que tu entends "fichier" ?
J'en déduis qu'un programme python dans un document LibO est nécessairement monofichier ?
Bonne soirée.

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 05 Nov 2016 22:47
par Hubert Lambert
jeanmi2403 a écrit:Par "module", je suppose que tu entends "fichier" ?

Un fichier python oui.
jeanmi2403 a écrit:J'en déduis qu'un programme python dans un document LibO est nécessairement monofichier ?

On peut voir la chose ainsi en effet. Si des scripts python se trouvent incorporés à un document dans des fichiers séparés, ils ne pourront malheureusement pas fonctionner ensemble via le système d'import natif. Il est sans doute possible d'utiliser le mécanisme d'invocation propre à uno, mais l'intérêt est a prior nul entre deux scripts python...

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 06 Nov 2016 17:24
par Hubert Lambert
Un truc qui semble fonctionner, même si cela paraît très peu orthodoxe et mériterait d'être solidement testé : utiliser le module stantard "zipimport", qui permet d'importer un module depuis un fichier zip. Comme les fichiers odf sont justement des zip, il suffit de passer le chemin complet vers la bibliothèque souhaitée dans le fichier (il faut que ledit fichier soit préalablement sauvegardé).
Exemple (voir fichier joint) :
Code : Tout sélectionner   AgrandirRéduire
import zipimport
import unohelper

doc = XSCRIPTCONTEXT.getDocument()
url = unohelper.fileUrlToSystemPath('{}/{}'.format(doc.URL,'Scripts/python'))
outils = zipimport.zipimporter(url).load_module('outils')

def testoutils(event=None):
    outils.msgbox("Importation de la bibliothèque <outils> réussie !")

Cordialement.

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 06 Nov 2016 17:53
par jeanmi2403
Bonsoir Hubert,
Comme disaient mes élèves : "Trop fort !" :D
Bien joué et merci, je vais tester...
Bon dimanche,

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 07 Nov 2016 10:41
par Hubert Lambert
J'ai amélioré le code en tenant compte du fait que le module zipimport est utilisé implicitement par python (ce qui supprime au passage les erreurs avec AOOo lorsqu'une url contient des caractères accentués) :

Code : Tout sélectionner   AgrandirRéduire
import sys
import unohelper

doc = XSCRIPTCONTEXT.getDocument()
url = unohelper.fileUrlToSystemPath('{}/{}'.format(doc.URL,'Scripts/python/lib'))
if not url in sys.path:
    sys.path.insert(0, url)
import outils

def testoutils(event=None):
    outils.msgbox(u"Importation de la bibliothèque <lib/outils> réussie !")

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 07 Nov 2016 15:00
par jeanmi2403
Bonjour,
Hubert Lambert a écrit: le module zipimport est utilisé implicitement par python [/code]

Je suppose que la source documentaire est ici : https://docs.python.org/2/library/zipimport.html ?
Cordialement,

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 07 Nov 2016 15:24
par Hubert Lambert
En effet.
Et petite précision en relisant cette doc :
pydoc a écrit:[...] if a ZIP archive doesn’t contain .pyc files, importing may be rather slow

si tu comptes vraiment utiliser ce mécanisme, il y aura un intérêt à placer la version compilée de ta bibliothèque (.pyc) à côté de la version source (.py).

Re: [Python] Bibliothèque de fonctions dans un document

MessagePublié: 07 Nov 2016 16:31
par jeanmi2403
Ok.
Trouvée dans __pycache__
[Résolu]
Merci,