2012-12-07 8 views
6

Ich habe PyInstaller nur einmal benutzt, und es funktionierte mit wxPython ziemlich einfach. Ich versuche gerade ein anderes Projekt zu erstellen. Das Projekt funktioniert gut, wenn es über die Befehlszeile ausgeführt wird. Nach dem Erstellen wird jedoch nie das Hauptfenster (wxPython) gestartet.Wie debugge ich einen nicht funktionierenden PyInstaller-Build?

Ich habe die Debug-und Konsolen-Flags in der Build-Spezifikation auf True gesetzt. Ich habe auch die ausführliche Option hinzugefügt ([('v', '', 'OPTION')]), wie in dem PyInstaller-Handbuch angegeben. Hier ist die Spezifikation:

 
# -*- mode: python -*- 
# basedir = os.path.realpath(os.path.dirname(__file__)) 
basedir = os.getcwd() 

# Build the icons toc. 
icons_toc = [] 
for dir in os.walk(os.path.join(basedir, 'icons')): 
    for icon in dir[2]: 
     icons_toc.append(
      (
       os.path.join('icons', icon), 
       os.path.join(dir[0], icon), 
       'DATA', 
      ) 
     ) 

a = Analysis(
    ['application.py'], 
    pathex=['.', './lib', '../broadpy/lib', '../broadpy/vendor'], 
    hiddenimports=[], 
    hookspath=None 
) 
a.datas += icons_toc 

pyz = PYZ(a.pure) 

exe = EXE(
    pyz, 
    a.scripts + [('v', '', 'OPTION')], 
    a.binaries, 
    a.zipfiles, 
    a.datas, 
    name=os.path.join(
     'dist', 'Address cleaner.exe' 
    ), 
    debug=True, 
    strip=None, 
    upx=True, 
    console=True 
) 

app = BUNDLE(
    exe, 
    name=os.path.join('dist', 'Address cleaner.app') 
) 

Nun, wenn ich die integrierte ausführbare Datei ausführen, bekomme ich diese Ausgabe:

C:\Users\tomas\Dropbox\Broadnet\address_cleaner>"C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe" 
_MEIPASS2 is NULL 
archivename is C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe 
Extracting binaries 
Executing self as child with Setting up to run child 
Creating child process 
Waiting for child process to finish... 
_MEIPASS2 is C:/Users/tomas/AppData/Local/Temp/_MEI30762/ 
archivename is C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe 
Already in the child - running! 
manifestpath: C:/Users/tomas/AppData/Local/Temp/_MEI30762/Address cleaner.exe.manifest 
Activation context created 
Activation context activated 
C:/Users/tomas/AppData/Local/Temp/_MEI30762/python27.dll 
Manipulating evironment 
PYTHONPATH=C:/Users/tomas/AppData/Local/Temp/_MEI30762;C:/Users/tomas/Dropbox/Broadnet/address_cleaner/dist 
PYTHONHOME=C:/Users/tomas/AppData/Local/Temp/_MEI30762/ 
v 
# installing zipimport hook 
import zipimport # builtin 
# installed zipimport hook 
importing modules from CArchive 
import marshal # builtin 
extracted iu 
import imp # builtin 
import nt # builtin 
extracted struct 
import _struct # builtin 
extracted archive 
Installing import hooks 
out00-PYZ.pyz 
Running scripts 
import zlib # builtin 
import errno # builtin 
import _weakref # builtin 
import _codecs # builtin 
import _sre # builtin 
import _collections # builtin 
import operator # builtin 
import itertools # builtin 
import _bisect # builtin 
import _heapq # builtin 
import thread # builtin 
import math # builtin 
import binascii # builtin 
import _hashlib # dynamically loaded from C:\Users\tomas\AppData\Local\Temp\_MEI30762\_hashlib.pyd 
import _random # builtin 
import cStringIO # builtin 
Traceback (most recent call last): 
    File "", line 65, in 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in importHook 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport 
    File "C:\Users\tomas\Dropbox\Broadnet\address_cleaner\build\pyi.win32\buildspec\out00-PYZ.pyz\win32com", line 5, in 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in importHook 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 459, in doimport 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 248, in getmod 
    File "C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py", line 105, in getmod 
ImportError: DLL load failed: The specified module could not be found. 
RC: -1 from pyi_rth_win32comgenpy 
OK. 
Deactivating activation context 
Releasing activation context 
Done 
# clear __builtin__._ 
# clear sys.path 
# clear sys.argv 
# clear sys.ps1 
# clear sys.ps2 
# clear sys.exitfunc 
# clear sys.exc_type 
# clear sys.exc_value 
# clear sys.exc_traceback 
# clear sys.last_type 
# clear sys.last_value 
# clear sys.last_traceback 
# clear sys.path_hooks 
# clear sys.path_importer_cache 
# clear sys.meta_path 
# clear sys.flags 
# clear sys.float_info 
# restore sys.stdin 
# restore sys.stdout 
# restore sys.stderr 
# cleanup __main__ 
# cleanup[1] cStringIO 
# cleanup[1] __future__ 
# cleanup[1] _collections 
# cleanup[1] encodings 
# cleanup[1] site 
# cleanup[1] atexit 
# cleanup[1] shutil 
# cleanup[1] _heapq 
# cleanup[1] _weakref 
# cleanup[1] abc 
# cleanup[1] _bisect 
# cleanup[1] _weakrefset 
# cleanup[1] tempfile 
# cleanup[1] binascii 
# cleanup[1] sre_constants 
# cleanup[1] collections 
# cleanup[1] _codecs 
# cleanup[1] _warnings 
# cleanup[1] math 
# cleanup[1] operator 
# cleanup[1] fnmatch 
# cleanup[1] codecs 
# cleanup[1] re 
# cleanup[1] _struct 
# cleanup[1] thread 
# cleanup[1] keyword 
# cleanup[1] signal 
# cleanup[1] random 
# cleanup[1] itertools 
# cleanup[1] encodings.aliases 
# cleanup[1] exceptions 
# cleanup[1] heapq 
# cleanup[1] sre_compile 
# cleanup[1] _sre 
# cleanup[1] _random 
# cleanup[1] hashlib 
# cleanup[1] bisect 
# cleanup[1] sre_parse 
# cleanup[1] _hashlib 
# cleanup[2] copy_reg 
# cleanup[2] iu 
# cleanup[2] os.path 
# cleanup[2] archive 
# cleanup[2] struct 
# cleanup[2] errno 
# cleanup[2] imp 
# cleanup[2] _abcoll 
# cleanup[2] ntpath 
# cleanup[2] nt 
# cleanup[2] genericpath 
# cleanup[2] stat 
# cleanup[2] zipimport 
# cleanup[2] warnings 
# cleanup[2] UserDict 
# cleanup[2] types 
# cleanup[2] zlib 
# cleanup[2] linecache 
# cleanup[2] os 
# cleanup[2] marshal 
# cleanup sys 
# cleanup __builtin__ 
# cleanup ints: 41 unfreed ints 
# cleanup floats: 31 unfreed floats 
Back to parent... 
Freeing status for C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe 

So, jetzt sehe ich, gibt es eine erhöhte Ausnahme von iu.py, aber ich habe noch keine Idee warum. Ich finde es auch ziemlich mysteriös, dass eine Python-Datei in meinem Downloads/py-installer-Ordner ausgeführt wird, selbst wenn ich diesen Ordner lösche.

Also zusammenzufassen - welche Schritte muss ich unternehmen, um genau herauszufinden, warum die Anwendung beim Start abstürzt?


Ich verwende PyInstaller 2.0 mit Python 2.7.3 auf Windows 8. Keiner dieser Tatsachen allein verursacht diesen Fehler, wie ich erfolgreich ein anderes Projekt baute.

Antwort

0

Ich weiß, dass diese Antwort nicht beantwortet, wie man Probleme wie diese debuggt, also werde ich es nicht als richtig markieren, aber ich habe es geschafft, die Anwendung zu bauen, und ich dachte, ich sollte teilen wie. Ich habe drei Dinge, von denen jeder die Ursache des Fehlers sein könnte, aber wir werden nie wissen:

  • ich Active 2.7.3 mit der offiziellen Python 2.7.3 ersetzt.
  • Ich ersetzte MySQLdb durch den reinen Python-Drop-in-Ersatz pymysql.
  • Ich ersetzte Levenshtein mit der sehr ähnlichen Methode .
1

Pyinstaller sometimes needs explicit references in the .spec file to correctly package dependencies.

Weitere Informationen finden Sie unter ensuring proper import statements so that pyinstaller recognizes them.

Zum Beispiel ist es sehr einfach, wichtige Abhängigkeiten zu übersehen, wenn sie von außerhalb eines Ihrer Python-Module importiert werden (z. B. aus einer Jar- oder C++ - Datei, die pyinstaller nicht lesen wird).

dependency walker könnte Ihre erste Verteidigungslinie zum systematischen Tracking fehlende DLLs sein. Laden Sie es einfach herunter und laden Sie dann Ihre exe oder verbundenen DLLs, um zu sehen, welche Abhängigkeiten fehlen. Dann ist es nur eine wilde Gans Verfolgung sie aufzuspüren und sie manuell in Ihr Verzeichnis zusammen mit der .exe (vorausgesetzt, Ihre Verpackung in ein Verzeichnis).

Als Randbemerkung, für pyinstaller 2.1 (Python 2.7.6), habe ich geändert, um die pyi_importers.py Datei zumindest zu versuchen und zu drucken, welches Modul die Unruhestifter waren beim Import: Dann

# line 409 of Pyinstaller.loader.pyi_importers.py 
try: module = imp.load_module(fullname, fp, filename, self._c_ext_tuple) 
except Exception as e: 
    print fullname # at least tells you what module couldn't be imported 
    raise e 

, zu wissen, wo Nachdem das Problem aufgetreten ist, können Sie das Problem mit dem Abhängigkeits-Walker genau angeben, um die fehlenden DLLs zu entfernen.

+0

Ich hatte das gleiche Problem, danke. –

+0

Was mein Problem behoben hat, bestand darin, ein pyd-Modul (vor allem für pcapy) auf WinXP neu zu kompilieren und es in meine Windows 7-Python-Installation zu kopieren. Jetzt kann meine pyinstaller exe, die ich auf Windows 7 baue auch auf Windows XP UND Windows 7 –

+0

Sie können in der Lage sein zu helfen, mein [Problem] zu lösen (http://stackoverflow.com/questions/41073132/pyinstaller-app-is-accessing -txt-Dateien-aber-nicht-schreiben-an-sie-funktioniert-vor-ap). – Phillip

Verwandte Themen