Как отладить неработающую сборку PyInstaller?

Я использовал PyInstaller только один раз раньше, и он работал довольно прямо с wxPython. В настоящее время я пытаюсь создать другой проект. Проект хорошо работает при запуске из командной строки. Однако после его создания он никогда не запускает главное окно (wxPython).

Я установил флаги отладки и консоли True в спецификации сборки. Я также добавил подробный вариант ( [('v', '', 'OPTION')] ), как указано в руководстве PyInstaller. Вот спецификация:

 # - * - режим: python - * -
 # basedir = os.path.realpath (os.path.dirname (__ file__))
 basedir = os.getcwd ()

 # Создайте иконки toc.
 icons_toc = []
 для dir в os.walk (os.path.join (basedir, 'icons')):
     для значка в каталоге [2]:
         icons_toc.append (
             (
                 os.path.join («значки», значок),
                 os.path.join (dir [0], значок),
                 'ДАННЫЕ',
             )
         )

 a = Анализ (
     [ '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,
     имя = os.path.join (
         'dist', 'Address cleaner.exe'
     ),
     отлаживать = True,
     полоса = нет,
     UPX = True,
     Консоль = True
 )

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

Теперь, когда я запускаю встроенный исполняемый файл, я получаю этот вывод:

  C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner> "C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe"
 _MEIPASS2 - NULL
 archivename - C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe
 Извлечение двоичных файлов
 Выполнение self как дочернего с установкой для запуска дочернего элемента
 Создание дочернего процесса
 Ожидание завершения дочернего процесса ...
 _MEIPASS2 - это C: / Users / tomas / AppData / Local / Temp / _MEI30762 /
 archivename - C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe
 Уже у ребенка - бег!
 manifestpath: C: / Пользователи / tomas / AppData / Local / Temp / _MEI30762 / Адрес cleaner.exe.manifest
 Создан контекст активации
 Включен контекст активации
 C: /Users/tomas/AppData/Local/Temp/_MEI30762/python27.dll
 Управление окружающей средой
 PYTHONPATH = C: / Users / Tomas / AppData / Local / Temp / _MEI30762; C: / Users / Tomas / Dropbox / Broadnet / address_cleaner / расстояние
 PYTHONHOME = C: / Users / Tomas / AppData / Local / Temp / _MEI30762 /
 v
 # установка zipimport hook
 импорт zipimport # builtin
 # установлен zipimport hook
 импорт модулей из CArchive
 Импорт маршала # builtin
 извлеченный iu
 import imp # builtin
 import nt # builtin
 извлеченная структура
 import _struct # builtin
 извлеченный архив
 Установка импортных крючков
 out00-PYZ.pyz
 Запуск скриптов
 импортировать zlib # builtin
 import errno # builtin
 import _weakref # builtin
 import _codecs # builtin
 import _sre # builtin
 import _collections # builtin
 оператор импорта # builtin
 импортировать itertools # builtin
 import _bisect # builtin
 import _heapq # builtin
 импортировать поток # builtin
 импортировать математику # builtin
 import binascii # builtin
 import _hashlib # динамически загружается из C: \ Users \ tomas \ AppData \ Local \ Temp \ _MEI30762 \ _hashlib.pyd
 import _random # builtin
 импортировать cStringIO # builtin
 Traceback (последний последний вызов):
   Файл "", строка 65, в 
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 386, в importHook
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 480, в doimport
   Файл «C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ build \ pyi.win32 \ buildspec \ out00-PYZ.pyz \ win32com", строка 5, в 
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 386, в importHook
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 459, в doimport
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 248, в getmod
   Файл «C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py», строка 105, в getmod
 ImportError: Ошибка загрузки DLL: указанный модуль не найден.
 RC: -1 из pyi_rth_win32comgenpy
 ОК.
 Деактивация контекста активации
 Освобождение контекста активации
 Готово
 # 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
 # очистка [1] __future__
 # cleanup [1] _collections
 # очистка [1] кодировки
 # очистка [1] сайт
 # очистка [1] atexit
 # cleanup [1] shutil
 # cleanup [1] _heapq
 # очистка [1] _weakref
 # cleanup [1] abc
 # cleanup [1] _bisect
 # cleanup [1] _weakrefset
 # cleanup [1] tempfile
 # cleanup [1] binascii
 # cleanup [1] sre_constants
 # очистка [1] коллекции
 # cleanup [1] _codecs
 # cleanup [1] _warnings
 # cleanup [1] математика
 # cleanup [1] оператор
 # cleanup [1] fnmatch
 # очистка [1] кодеков
 # cleanup [1] re
 # cleanup [1] _struct
 # очистка [1] поток
 # очистка [1] ключевое слово
 # очистка [1] сигнала
 # cleanup [1] случайный
 # cleanup [1] itertools
 # cleanup [1] encodings.aliases
 # очистка [1] исключений
 # cleanup [1] heapq
 # cleanup [1] sre_compile
 # cleanup [1] _sre
 # cleanup [1] _random
 # cleanup [1] hashlib
 # очистка [1] bisect
 # cleanup [1] sre_parse
 # очистка [1] _hashlib
 # cleanup [2] copy_reg
 # cleanup [2] iu
 # cleanup [2] os.path
 # очистка [2] архив
 # cleanup [2] struct
 # cleanup [2] errno
 # cleanup [2] imp
 # очистка [2] _abcoll
 # cleanup [2] ntpath
 # cleanup [2] nt
 # cleanup [2] genericpath
 # cleanup [2] stat
 # cleanup [2] zipimport
 # очистка [2] предупреждения
 # cleanup [2] UserDict
 # очистка [2] типов
 # cleanup [2] zlib
 # очистка [2] linecache
 # очистка [2] os
 # очистка [2] маршал
 # cleanup sys
 # cleanup __builtin__
 # cleanup ints: 41 неподтвержденный ints
 # очистка поплавков: 31 несвободных поплавков
 Вернуться к родительскому ...
 Статус освобождения для C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe

Итак, теперь я вижу, что существует повышенное исключение из iu.py, но я до сих пор не знаю, почему. Я также считаю довольно загадочным, что файл python в моей папке Downloads / py-installer запущен, даже если я удалю эту папку.

Итак, чтобы подвести итог – какие шаги я должен предпринять, чтобы выяснить, почему приложение врезается при запуске?


Я использую PyInstaller 2.0 с Python 2.7.3 в Windows 8. Ни один из этих фактов не вызывает эту ошибку, так как я успешно создаю еще один проект.

Pyinstaller иногда нуждается в явных ссылках в файле .spec для правильной упаковки зависимостей .

Для получения дополнительной информации см. Обеспечение правильных инструкций импорта, чтобы pyinstaller распознал их .

Например, очень легко пропустить критические зависимости, если они импортируются извне одного из ваших модулей Python (например, из файла jar или c ++, который pyinstaller не будет читать).

dependency walker может стать вашей первой линией защиты для систематического отслеживания недостающих DLL. Просто загрузите его, а затем загрузите exe или связанные DLL, чтобы увидеть, какие из них отсутствуют. Затем это просто дикая охота за гусями, отслеживая их и вручную добавляя их в ваш каталог вместе с .exe (при условии, что ваша упаковка в одном каталоге ).

В качестве примечания, для pyinstaller 2.1 (python 2.7.6), я изменил файл pyi_importers.py чтобы хотя бы попробовать и распечатать, какой модуль был создателем проблемы при импорте:

 # 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 

Затем, зная, где произошла ошибка, вы можете указать проблему с помощью ходячего зависимостей, чтобы исправить недостающие библиотеки DLL.

Я знаю, что этот ответ не отвечает, как отлаживать такие проблемы, поэтому я не буду отмечать его как правильно, но мне удалось создать приложение, и я подумал, что должен поделиться тем, как это сделать. Я сделал три вещи, каждая из которых могла быть причиной ошибки, но мы никогда не узнаем:

  • Я заменил ActivePython 2.7.3 официальным Python 2.7.3.
  • Я заменил MySQLdb на чистую замену pythysql на python.
  • Я заменил Левенштейна очень похожим методом difflib.SequenceMatcher.ratio .