PyInstaller, spec-Datei, ImportError: No module named 'blah'
Ich versuche zu bauen, ein python-script über PyInstaller. Benutzt habe ich die folgenden Befehle zum konfigurieren, erstellen Sie eine spec-Datei, und erstellen:
wget pyinstaller.zip, extracted it, python Configure.py, etc, then:
python pyinstaller/Makespec.py --onefile myscript.py
python pyinstaller/Build.py myscript.spec
Hier ist die spec-Datei, die er erzeugt:
# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
pathex=['/home/user/projects/icinga_python/releases/v2.1'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'myscript'),
debug=False,
strip=False,
upx=True,
console=1 )
Dieser baute eine ausführbare Datei, die im dist/
- Verzeichnis. Wenn Sie versuchen, diese Datei ausführen möchte, bekomme ich folgende:
Traceback (most recent call last):
File "<string>", line 12, in <module>
File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
raise ImportError, "No module named %s" % fqname
ImportError: No module named mysql
Wenn ich mich bewegte diese ausführbare Datei in das Verzeichnis, das die eigentlichen Python-code, gab es unterschiedliche Ergebnisse:
Traceback (most recent call last):
File "<string>", line 12, in <module>
File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook
mod = _self_doimport(nm, ctx, fqname)
File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport
exec co in mod.__dict__
File "CLUSTER/mysql/icingasql.py", line 13, in <module>
import urllib2
File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
raise ImportError, "No module named %s" % fqname
ImportError: No module named urllib2
... pyinstaller docs Ich sehe, dass --onefile
ist die option die ich brauche/möchte, aber aus irgendeinem Grund nicht alles kompiliert wird.
Das Skript ist nicht wirklich darunter etwas Phantasie, nur kleine schnelle Module, die ich schrieb für sql-Anweisungen und Analyse bestimmter Webseiten.
sorry, was tun? ist, dass in der spec-Datei?
docs.python.org/tutorial/modules.html
InformationsquelleAutor Cmag | 2011-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler kann ocurre wenn Sie dynamischen Importe im code. In diesem Fall pyinstaller nicht enthalten diese Pakete in der exe-Datei. In diesem Fall können Sie:
Einer Datei ändert nicht alles, was in Ihren code ausführen. Wenn Sie erstellen --onefile exe-alle Dateien erstellt von pyinstaller verpackt auf die exe-Datei, und entpackt das lokale temp-jedes mal, wenn Sie ausführen, exe.
InformationsquelleAutor gkocjan
Das problem ist, dass pyinstaller nicht sehen zweiten Ebene Einfuhren. Also, wenn Sie import-Modul Eine, pyinstaller diese sieht. Aber jedes zusätzliche Modul, das importiert wird in Eine nicht gesehen werden.
Gibt es keine Notwendigkeit, etwas zu ändern in Ihrem python-Skripts. Sie können direkt fügen Sie die fehlenden Importe zu den spec-Datei.
Fügen Sie einfach die folgenden in
a = Analysis(...)
:Sollte dies das Ergebnis:
Danach laufen pyinstaller mit der spec-Datei als argument.
Das ist nicht wahr. PyInstaller finden secondlevel-Importe. Aber manchmal sind Module, die dynamisch importiert. (Der import erfolgt in den code mit importlib) und damit PyInstaller ist nicht in der Lage zu finden, das Modul. In diesen Fällen werden die hidden-import-Klausel kann Ihr problem lösen. Darüber hinaus wird in den meisten Fällen werden Sie nicht brauchen, um ausführen die Analyse separat und fügen Sie die versteckten Import-Klausel, um die pyinstaller-Befehl finden Sie das Modul.
InformationsquelleAutor user1251007
nur gonna hinzufügen, meine 2 cents, denn ich hatte das gleiche problem heute - 6 Jahre später 😀
Für Windows:
Dann war ich in der Lage zu führen Sie die exe-Datei durch Doppelklick.
Stellte sich heraus, ziemlich einfach. Was hat den trick für mich war die "--onfile" und hinzufügen von meinen anderen Dateien in den "dist" - Ordner.
"--Windowed" einfach so ist, dass die python-Befehl-Fenster wird nicht pop-up, wenn Sie starten Sie die exe-Datei.
InformationsquelleAutor Cribber