py2exe: Сгенерированный EXE-файл не загружается

#python #pyqt4 #py2exe

#python #pyqt4 #py2exe

Вопрос:

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

Мое приложение не отображало SVG-изображения при загрузке (из Exe), поэтому я немного покопался и увидел, что мне пришлось изменить свой setup.py , чтобы включить a qt.conf и некоторые библиотеки DLL.

Затем двоичный файл просто перестал загружаться после qt.conf включения.

Я поиграл с qt.conf и обнаружил, что мой Exe-файл не загружается, пока я не удалю qt.conf его, поэтому я думаю, что он искажен.

Вот мой qt.conf :

 [Paths]
Plugins = plugins
 

Я пробовал это с абсолютными контурами, косыми чертами вперед, косыми чертами назад, как угодно. Я даже скопировал всю папку PyQt4 с этим файлом, и все равно не повезло.

Если это актуально, вот мой setup.py :

 import os, sys, glob

from distutils.core import setup
from py2exe.build_exe import py2exe

def find_data_files(source,target,patterns):
  if glob.has_magic(source) or glob.has_magic(target):
    raise ValueError("Magic not allowed in src, target")

  ret = {}

  for pattern in patterns:
    pattern = os.path.join(source,pattern)

    for filename in glob.glob(pattern):
      if os.path.isfile(filename):
        targetpath = os.path.join(target,os.path.relpath(filename,source))
        path = os.path.dirname(targetpath)
        ret.setdefault(path,[]).append(filename)
  return sorted(ret.items())

setup(
#  zipfile = None,
  data_files = find_data_files('', '', ['bin/*', 'plugins/iconengines/*', 'qt.conf']),
  windows = [{'script': 'main.py'}],
#  cmdclass = {'py2exe': Py2exe},
  options = {
  'py2exe': {
    'bundle_files': 1,
    'includes': ['sip'],
    'dll_excludes': ['MSVCP90.dll']#, 'qsvgicon4.dll']
  }
  }
)
 

Ответ №1:

Если я правильно помню, Py2exe прекращен, поэтому его использование действительно небезопасно.

Я использую cx_Freeze, который ни разу не подвел меня в работе. Это тоже может вам помочь.

Кроме того, помните, что пути различаются при зависании в скрипте. Как правило, вам нужен os.path.dirname(sys.executable) замороженный (который вы можете протестировать на использование hasattr(sys, 'frozen') ), а не обычный os.path.dirname(__file__) .

Кроме того, убедитесь, что вы копируете imageformats каталог плагинов qt. Раньше это вызывало проблемы у людей. В папке imageformats также находится плагин svg. Вам также потребуется скопировать PyQt4.QtXml и PyQt4.QtSvg dll / so также (требуется плагином svg).

В моем проекте есть build_binary.py файл для cx_Freeze, который автоматически определяет каталог плагина и копирует необходимые данные. Это может помочь вам взглянуть на него.

Комментарии:

1. py2exe казался немного неуклюжим, а cx_freeze хорошо работал для меня в Linux, поэтому я попробую еще раз. Я обязательно посмотрю на ваш код, и поскольку ваш проект использует SVGS и работает при компиляции в двоичный файл, я думаю, ваш код работает! Спасибо.