OVH Cloud OVH Cloud

py2exe, modules appear to be missing

10 réponses
Avatar
Titouille
Bonjour à tous !!

Je suis en train de générer un projet qui utilise différentes librairies.

J'utilise py2exe pour en faire un exécutable (python 2.3 + wxpython)
mais lorsque je tente de générer mon projet, j'ai l'erreur suivante à la
fin :

The following modules appear to be missing
['_rl_accel', 'jarray', 'java.awt.image', 'javax.imageio',
'local_rl_config', 'reportlab.lib._rl_accel', 'reportlab.lib.pyHnj',
'reportlab.monitor', 'yaml']


Ce n'est pas la première fois, mais sur ce coup là, ça me dérange un
peu, car certains modules sont vraiment utilisés dans mon application
(reportlab et surement les modules java image), et le fait qu'ils
manquent font que mon application ne fonctionne pas correctement...


J'ai tenté de rajouter des options "package", mais rien n'y fait,
toujours le même message d'erreur...

opts = {
"py2exe":
{
"packages":
[
"_rl_accel",
"jarray",
"java.awt.image",
"javax.imageio",
"local_rl_config",
"reportlab.lib._rl_accel",
"reportlab.lib.pyHnj",
"reportlab.monitor",
"yaml"
]
}
}



Bref... si quelqu'un a une suggestion... :)


D'avance merci


Thierry

10 réponses

Avatar
Amaury
Bonjour

Bonjour à tous !!

Je suis en train de générer un projet qui utilise différentes librairies.

J'utilise py2exe pour en faire un exécutable (python 2.3 + wxpython)
mais lorsque je tente de générer mon projet, j'ai l'erreur suivante à la
fin :

The following modules appear to be missing
['_rl_accel', 'jarray', 'java.awt.image', 'javax.imageio',
'local_rl_config', 'reportlab.lib._rl_accel', 'reportlab.lib.pyHnj',
'reportlab.monitor', 'yaml']


Ce n'est pas la première fois, mais sur ce coup là, ça me dérange un
peu, car certains modules sont vraiment utilisés dans mon application
(reportlab et surement les modules java image), et le fait qu'ils
manquent font que mon application ne fonctionne pas correctement...



Dans le cas précis de _rl_accel, ce n'est pas grave. ce module est une
réimplémentation en C de certaines fonctions pour des raisons de
performance. S'il ne peut être importé, reportlab les mêmes fonctions en
python, plus lentes mais tout aussi correctes.

Peut-être n'as-tu pas compilé ces extensions, ou bien py2exe ne peut pas
les trouver dans les chemins habituels ?
Essaie de les importer en ligne de commande:
from reportlab.lib import _rl_accel




--
Amaury



Avatar
remi_inconnu
Les problèmes fréquents que je rencontre avec py2exe sont de
plusieurs ordres :
- Soit c'est une DLL ou un Pyd manquant, et cela py2exe ne te le
rajoute pas toujours. Il te faut alors un outils pour connaitre la
liste des dll manquantes de ton exe, dependency walker te permet de
trouver ce genre de problème.
- Soit le chemin des fichiers py contenu dans le zip n'est pas
accessible, il te faudra peut être ajouter un path.append("chemin")
dans ton application.
- Soit l'import de tes modules se fait de manière peu orthodoxe
(__import__ par exemple), et là il te faut recopier la partie des
sources manquants dans le répertoire de l'application, et bien entendu
rajouter un path.append(".")
- Soit, en dernier ressort, patcher les librairies que tu utilises pour
forcer leur importation de manière plus propre.
Mais dans tous les cas, tu devras analyser le résultat d'erreur
d'exécution de ton application, et dépenser quelques heures, pour
atteindre le nirvana (une appli qui marche sans python.exe).
Après un ptit coup d'Inno setup et d'Istools et là tu peux la
distribuer à la terre entière.

Voila... en espérant que cela t'aide.

PS: Si tu utilises une version ancienne de py2exe qui ne génère pas
de fichier library.zip, si c'est ce genre de version que tu as, il est
intéressant de savoir que l'on peut ouvrir l'exécutable avec winzip,
pour voir son contenu, et quelque fois c'est instructif de savoir
comment il range dans l'exe les fichiers pour renseigner correctement
le pythonPath.
Avatar
Amaury
Rebonjour,

Bonjour à tous !!

Je suis en train de générer un projet qui utilise différentes librairies.

J'utilise py2exe pour en faire un exécutable (python 2.3 + wxpython)
mais lorsque je tente de générer mon projet, j'ai l'erreur suivante à la
fin :

The following modules appear to be missing
['_rl_accel', 'jarray', 'java.awt.image', 'javax.imageio',
'local_rl_config', 'reportlab.lib._rl_accel', 'reportlab.lib.pyHnj',
'reportlab.monitor', 'yaml']


Ce n'est pas la première fois, mais sur ce coup là, ça me dérange un
peu, car certains modules sont vraiment utilisés dans mon application
(reportlab et surement les modules java image), et le fait qu'ils
manquent font que mon application ne fonctionne pas correctement...


Ces modules 'java' m'intriguent. Que viennent-ils faire dans une
application py2exe?
C'est peut-être ton code qui utilise ces librairies java explicitement,
(avec un mécanisme de connexion que je ne connais pas), et tu risques
d'avoir d'autres problèmes lors du déploiement de ton application, si
java n'est pas installé.
Mais je soupçonne reportlab de fournir du code qui fonctionne à la fois
pour python et jython. Les imports en 'java' sont alors conditionnés par
des 'if', et n'ont de sens que dans un environnement jython.

D'où ma question: pourquoi ton application ne fonctionne-t-elle pas ?
Y a-t-il un message d'erreur ?

--
Amaury

Avatar
Titouille
Amaury, j'ai tenté ta technique, mais je n'ai pas réussi à avoir le
résultat voulu... toujours le même message d'erreur... Mais peut-être
que je m'y prend mal...

Sur tes conseils, j'ai cherché un peu dans les différents fichiers...
J'utilise python 2.3 et py2exe pour la même version. J'ai donc un
fichier "library.zip" qui semble contenir différents packages, mais les
fichiers cités dans le message d'erreur n'ont pas l'air d'être présent
dans le zip (ex, le répertoire reportlab.lib existe dans le zip, mais le
fichier pyHnj ou _rl_accel ne s'y trouvent pas... idem pour
reportlab.monitor et yaml, et les autres...

Donc les fichiers n'y sont pas, mais je n'ai pas l'impression d'avoir
les fichiers pyd correspondants... est-ce que je dois les générer
moi-même ?? (je me souviens avoir fait des trucs du genre lorsque j'ai
tenté de génerer le module python ming pour Flash...)

Au niveau erreur d'exécution, j'ai eu 2 logs :

pythoncom error: Python error invoking COM method.
Traceback (most recent call last):
File "win32comserverpolicy.pyc", line 275, in _Invoke_
File "win32comserverpolicy.pyc", line 280, in _invoke_
File "win32comserverpolicy.pyc", line 541, in _invokeex_
File "monLivreVirtuel.py", line 100, in OnFSCommand
File "monLivreVirtuel.py", line 311, in getSubDirectories
File "pylibFileSystemCommands.pyc", line 214, in FlashGetSubDirectories
exceptions.StopIteration:

pythoncom error: Python error invoking COM method.
Traceback (most recent call last):
File "win32comserverpolicy.pyc", line 275, in _Invoke_
File "win32comserverpolicy.pyc", line 280, in _invoke_
File "win32comserverpolicy.pyc", line 541, in _invokeex_
File "monLivreVirtuel.py", line 121, in OnFSCommand
File "monLivreVirtuel.py", line 254, in moveAddedFilesToUSBStick
File "reportlablibutils.pyc", line 527, in __init__
File "PILImage.pyc", line 1745, in open
exceptions.IOError: cannot identify image file


La première est surement due à une erreur de codage. Par contre, la
seconde concerne la seule utilisation de reportlab dans mon appli, donc
je présume que ça provient des modules manquants, car si je le teste sur
mon environnement (ou j'ai python installé) tout va très bien.


Je ne sais pas si c'est normal, mais le package reportlab est installé
directement à la racine du répertoire python 2.3


Voilà. Si quelqu'un arrive à me donner quelques infos en + par rapport à
ces nouvelles infos, ça me serai bien utile... (genre une tite marche à
suivre... ex :

1. utiliser dépendency walker pour trouver les liaisons
2. utiliser xyz pour générer des pyc ou pyd correspondants aux besoins
3. intégrer les fichiers générés directement dans le rep de l'application
4. ajouter les fichiers dans le fichier setup py2exe (dans la section
package)
5...
6...)


Et je vous remercie pour toutes les précieuses informations que vous
fournissez sur le forum ;)


Cordialement,


Thierry




Les problèmes fréquents que je rencontre avec py2exe sont de
plusieurs ordres :
- Soit c'est une DLL ou un Pyd manquant, et cela py2exe ne te le
rajoute pas toujours. Il te faut alors un outils pour connaitre la
liste des dll manquantes de ton exe, dependency walker te permet de
trouver ce genre de problème.
- Soit le chemin des fichiers py contenu dans le zip n'est pas
accessible, il te faudra peut être ajouter un path.append("chemin")
dans ton application.
- Soit l'import de tes modules se fait de manière peu orthodoxe
(__import__ par exemple), et là il te faut recopier la partie des
sources manquants dans le répertoire de l'application, et bien entendu
rajouter un path.append(".")
- Soit, en dernier ressort, patcher les librairies que tu utilises pour
forcer leur importation de manière plus propre.
Mais dans tous les cas, tu devras analyser le résultat d'erreur
d'exécution de ton application, et dépenser quelques heures, pour
atteindre le nirvana (une appli qui marche sans python.exe).
Après un ptit coup d'Inno setup et d'Istools et là tu peux la
distribuer à la terre entière.

Voila... en espérant que cela t'aide.

PS: Si tu utilises une version ancienne de py2exe qui ne génère pas
de fichier library.zip, si c'est ce genre de version que tu as, il est
intéressant de savoir que l'on peut ouvrir l'exécutable avec winzip,
pour voir son contenu, et quelque fois c'est instructif de savoir
comment il range dans l'exe les fichiers pour renseigner correctement
le pythonPath.



Avatar
Titouille
Hello !

A mon sens aussi, les modules java doivent provenir des librairies
reportlab, car je n'avais jamais eu ce genre de message d'erreur avant
que je commence à utiliser des fonctions de génération de pdf

J'ai mis le message d'erreur résultant dans ma réponse à


En fait, ça plante sur la recherche de l'image, et pourtant, elle est
spécifiée en dur, donc je ne vois pas trop, si ce n'est pas un module
manquant.

A++

Thierry



Rebonjour,


Bonjour à tous !!

Je suis en train de générer un projet qui utilise différentes librairies.

J'utilise py2exe pour en faire un exécutable (python 2.3 + wxpython)
mais lorsque je tente de générer mon projet, j'ai l'erreur suivante à
la fin :

The following modules appear to be missing
['_rl_accel', 'jarray', 'java.awt.image', 'javax.imageio',
'local_rl_config', 'reportlab.lib._rl_accel', 'reportlab.lib.pyHnj',
'reportlab.monitor', 'yaml']


Ce n'est pas la première fois, mais sur ce coup là, ça me dérange un
peu, car certains modules sont vraiment utilisés dans mon application
(reportlab et surement les modules java image), et le fait qu'ils
manquent font que mon application ne fonctionne pas correctement...



Ces modules 'java' m'intriguent. Que viennent-ils faire dans une
application py2exe?
C'est peut-être ton code qui utilise ces librairies java explicitement,
(avec un mécanisme de connexion que je ne connais pas), et tu risques
d'avoir d'autres problèmes lors du déploiement de ton application, si
java n'est pas installé.
Mais je soupçonne reportlab de fournir du code qui fonctionne à la fois
pour python et jython. Les imports en 'java' sont alors conditionnés par
des 'if', et n'ont de sens que dans un environnement jython.

D'où ma question: pourquoi ton application ne fonctionne-t-elle pas ?
Y a-t-il un message d'erreur ?




Avatar
Amaury
Donc les fichiers n'y sont pas, mais je n'ai pas l'impression d'avoir
les fichiers pyd correspondants... est-ce que je dois les générer
moi-même ?? (je me souviens avoir fait des trucs du genre lorsque j'ai
tenté de génerer le module python ming pour Flash...)


Tu trouveras en tout cas reportlab.lib._rl_accel.pyd et
reportlab.lib.pyHnj.pyd déjà compilés chez reportlab:
http://www.reportlab.org/downloads.html#dlls

Autre chose: j'ai vu dans le code de reportlab plusieurs instructions du
genre:
if sys.platform[0:4] == 'java':
from javax.imageio import ImageIO
...
else:
import PIL.Image
...
On peut donc oublier les warnings concenant java, pour le moment.

pythoncom error: Python error invoking COM method.
Traceback (most recent call last):
File "win32comserverpolicy.pyc", line 275, in _Invoke_
File "win32comserverpolicy.pyc", line 280, in _invoke_
File "win32comserverpolicy.pyc", line 541, in _invokeex_
File "monLivreVirtuel.py", line 121, in OnFSCommand
File "monLivreVirtuel.py", line 254, in moveAddedFilesToUSBStick
File "reportlablibutils.pyc", line 527, in __init__
File "PILImage.pyc", line 1745, in open
exceptions.IOError: cannot identify image file


Une petite supposition: reportlab a ouvert un fichier image, et le passe
à PIL. PIL a besoin de récupérer le nom du fichier (a-t-il besoin de
l'extension pour déterminer le type d'image ?).
Mais dans ton cas, le 'fichier ouvert' est un flux extrait d'un zip (qui
est le .exe généré par py2exe), et il est donc impossible de récupérer
le nom du fichier avec les méthodes standard !

Tu pourrais essayer de stocker le fichier image à l'extérieur de
l'exécutable généré...

--
Amaury

Avatar
Titouille
voici les 2 dll manquantes spécifiées par dependency walker :


MSJAVA.DLL
EFSADU.DLL

Je ne les ai pas sur mon poste.

Je vais par contre essayer de récupérer les pyd de reportlab pour les
inclure.

Sinon, l'image est sur le disque, pas dans un zip. Mais ça doit provenir
des pyd reportlab manquants.

Je teste et je vous tiens au courant :)


Merci beaucoup


Thierry




Donc les fichiers n'y sont pas, mais je n'ai pas l'impression d'avoir
les fichiers pyd correspondants... est-ce que je dois les générer
moi-même ?? (je me souviens avoir fait des trucs du genre lorsque j'ai
tenté de génerer le module python ming pour Flash...)



Tu trouveras en tout cas reportlab.lib._rl_accel.pyd et
reportlab.lib.pyHnj.pyd déjà compilés chez reportlab:
http://www.reportlab.org/downloads.html#dlls

Autre chose: j'ai vu dans le code de reportlab plusieurs instructions du
genre:
if sys.platform[0:4] == 'java':
from javax.imageio import ImageIO
...
else:
import PIL.Image
...
On peut donc oublier les warnings concenant java, pour le moment.

pythoncom error: Python error invoking COM method.
Traceback (most recent call last):
File "win32comserverpolicy.pyc", line 275, in _Invoke_
File "win32comserverpolicy.pyc", line 280, in _invoke_
File "win32comserverpolicy.pyc", line 541, in _invokeex_
File "monLivreVirtuel.py", line 121, in OnFSCommand
File "monLivreVirtuel.py", line 254, in moveAddedFilesToUSBStick
File "reportlablibutils.pyc", line 527, in __init__
File "PILImage.pyc", line 1745, in open
exceptions.IOError: cannot identify image file



Une petite supposition: reportlab a ouvert un fichier image, et le passe
à PIL. PIL a besoin de récupérer le nom du fichier (a-t-il besoin de
l'extension pour déterminer le type d'image ?).
Mais dans ton cas, le 'fichier ouvert' est un flux extrait d'un zip (qui
est le .exe généré par py2exe), et il est donc impossible de récupérer
le nom du fichier avec les méthodes standard !

Tu pourrais essayer de stocker le fichier image à l'extérieur de
l'exécutable généré...




Avatar
Amaury
Sinon, l'image est sur le disque, pas dans un zip. Mais ça doit provenir
des pyd reportlab manquants.


J'ai trouvé la description d'un problème qui arrive quand on utilise PIL
sous py2exe:
http://starship.python.net/crew/theller/moin.cgi/PIL_20and_20py2exe

"""
Explication: PIL essaie automagiquement de détecter les plugins d'images
disponibles. Si le sens de "disponible" est bien défini pour une
installation standard Python, c'est beaucoup plus flou quand on utilise
py2exe.
"""

La solution suggérée est d'importer manuellement les gestionnaires
d'images. Au début de ton code, ajoute:
import PIL.Image
import PIL.PngImagePlugin
import PIL.JpegImagePlugin
import PIL.GifImagePlugin
...

--
Amaury

Avatar
Titouille
Re,


tout ceci est un peu frustrant :s

Je suis allé sur le wiki, j'ai bien lu tout ce que je pouvais
comprendre, j'ai mis des import pour la classe Image et les plugins
utilisés (png, jpg).

J'ai également surdéfini la classe ImageReader (directement dans mon
fichier de classe principal histoire de tester) comme expliqué ici :

http://starship.python.net/crew/theller/moin.cgi/PIL_20and_20reportlab

Mais cette fois, il me bronche que la classe MyImageReader n'a pas de
variable "fp" (qui est présente dans la classe de base)

Je n'y comprend toujours pas grand chose, et c'est pas faute de chercher :(


J'ai également téléchargé les dll (pyd) reportlab, mais pas de
changement, le message d'erreur "modules semblent manquants" est
toujours présent. J'ai placé les pyd dans le répertoire python23/dll et
directement à la racine de mon application, nada.


Les explications du wiki semblent intéressante, j'ai surement du louper
un truc quelque part...


A++

Thierry


Sinon, l'image est sur le disque, pas dans un zip. Mais ça doit
provenir des pyd reportlab manquants.



J'ai trouvé la description d'un problème qui arrive quand on utilise PIL
sous py2exe:
http://starship.python.net/crew/theller/moin.cgi/PIL_20and_20py2exe

"""
Explication: PIL essaie automagiquement de détecter les plugins d'images
disponibles. Si le sens de "disponible" est bien défini pour une
installation standard Python, c'est beaucoup plus flou quand on utilise
py2exe.
"""

La solution suggérée est d'importer manuellement les gestionnaires
d'images. Au début de ton code, ajoute:
import PIL.Image
import PIL.PngImagePlugin
import PIL.JpegImagePlugin
import PIL.GifImagePlugin
...




Avatar
Titouille
Ok.

Amaury tu avais tout à fait raison :

en début de fichier :

import PIL.Image
import PIL.PngImagePlugin
import PIL.JpegImagePlugin
#import PIL.***ImagePlugin, etc...

J'avais suivi les instructions du wiki pour PIL et reportlab, mais en
fait, il suffisait de rajouter les import (avec PIL en préfixe, sinon ça
ne fonctionne pas...)

Merci beaucoup pour ton aide, je peux enfin terminer :)



Thierry





Sinon, l'image est sur le disque, pas dans un zip. Mais ça doit
provenir des pyd reportlab manquants.



J'ai trouvé la description d'un problème qui arrive quand on utilise PIL
sous py2exe:
http://starship.python.net/crew/theller/moin.cgi/PIL_20and_20py2exe

"""
Explication: PIL essaie automagiquement de détecter les plugins d'images
disponibles. Si le sens de "disponible" est bien défini pour une
installation standard Python, c'est beaucoup plus flou quand on utilise
py2exe.
"""

La solution suggérée est d'importer manuellement les gestionnaires
d'images. Au début de ton code, ajoute:
import PIL.Image
import PIL.PngImagePlugin
import PIL.JpegImagePlugin
import PIL.GifImagePlugin
...