Компиляция кода Python в один exe - PullRequest
4 голосов
/ 24 октября 2011

Я пытался скомпилировать код Python в один исполняемый файл, и мне не удалось сделать это правильно.

  1. Я пробовал pyinstaller, и это файл .spec:

    # -*- mode: python -*-
    a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'programs\\toolbox.py'],
             pathex=['C:\\Users\\Ronaldo\\Desktop\\Python\\pyinstaller'])
    pyz = PYZ(a.pure)
    exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'program.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=False )
    

    Pyinstaller скомпилирован нормально, создал один исполняемый файл, который работал, но, очевидно, другие пользователи, которые не имели ту же версию Установленный Python (2.7.2) не может его запустить. Не дает никакой ошибки, просто не запускается. Я попробовал, отправив это несколько друзей, а также попробовал на виртуальной машине.

  2. Пробовал py2exe. Когда дело доходит до компиляции (со всеми библиотеками рядом с ним и остальные файлы) работает нормально. Я старался компилируя его в один файл, но скомпилированный исполняемый файл дал мне " toolbox.exe перестал работать "ошибка. Вот сообщение об ошибке, на всякий случай может быть полезно:

    Problem signature:
      Problem Event Name:   APPCRASH
      Application Name: toolbox.exe
      Application Version:  0.0.0.0
      Application Timestamp:    49180193
      Fault Module Name:    StackHash_0a9e
      Fault Module Version: 0.0.0.0
      Fault Module Timestamp:   00000000
      Exception Code:   c0000005
      Exception Offset: 01b61fcb
      OS Version:   6.1.7601.2.1.0.256.1
      Locale ID:    1033
      Additional Information 1: 0a9e
      Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
      Additional Information 3: 0a9e
      Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
    

    Файл setup.py:

    from distutils.core import setup
    import py2exe, sys, os
    
    sys.argv.append('py2exe')
    
    setup(
        options = {'py2exe': {'bundle_files': 1}},
        windows = [{'script': "toolbox.py"}],
        zipfile = None,
    ) single.py file:
    

    А вот сингл.py:

    import os, sys, ctypes
    
    ctypes.windll.user32.MessageBoxA(0,
        "curdir: %s\nexedir: %s\nsys.winver: %s" % (
            os.path.abspath(os.curdir),
            os.path.abspath(os.path.dirname(sys.argv[0])),
            sys.winver,
        ), "%s - Message" % os.path.basename(sys.executable), 0x30
    )
    

В написанной мною программе используются модули tkinter, sys, random и win32clipboard (pywin). Что я делаю неправильно? Есть ли другие, лучшие компиляторы?

Обновление: по совету Жоэля, я скомпилировал с отладкой и в режиме консоли. Тем не менее не работает для пользователей, которые не имеют Python 2.7. Это сообщение об ошибке:

C:\Users\XXXXX\Desktop>program.exe
Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe
Extracting binaries
Setting up to run child
Setting magic environment var
Creating child process
Waiting for child process to finish...
Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe
workpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/
manifestpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/program.exe.manifest
Activation context created
Activation context activated
C:\Users\XXXXX\AppData\Local\Temp\_MEI14042\python27.dll
Manipulating evironment
PYTHONPATH=C:/Users/XXXXX/AppData/Local/Temp/_MEI14042;C:/Users/XXXXX/Desktop
importing modules from CArchive
extracted iu
extracted struct
extracted archive
Installing import hooks
outPYZ1.pyz

Я действительно надеюсь, что это послужит подсказкой для возможного ответа.

1 Ответ

2 голосов
/ 26 октября 2011

Мои два цента: вы делали тест, используя опцию debug PyInstaller?

Просто обновите свой specfile:

exe = EXE( pyz,
           [...]
           debug=True,
           [...])

(Примечание: во избежание многочисленных окон сообщений вы можете настроить вывод консоли: console=True)

Возможноэто вернуло бы некоторые полезные данные.Пожалуйста, предоставьте нам выходные данные в этом случае (если они есть).


В соответствии с полученным выводом, это довольно распространенная проблема, потому что, если PyInstaller разрешает зависимости для ваших модулей, зависимости могут зависетьбыть забытым

В вашем случае, Tcl отсутствует, и это необходимо для некоторой библиотеки Tkinter: вы должны взглянуть здесь: Python, Pyinstaller создает ярлыки в окнах

В соответствии с документацией:

Разработка для Makespec.py, это поддерживаемая командная строка: python Makespec.py [opts] [...] Где разрешенные опции:

[...]

-K, --tk включить TCL / TK в развертывание.

Вы можете попробовать использовать этот аргумент и проверить влияние наваш spec файл.Бьюсь об заклад, это дополнение в модулях, учитываемых в анализе или в функции EXE.

...