Сборка исполняемых файлов для Python 3 и PyQt - PullRequest
21 голосов
/ 15 ноября 2009

Я создал довольно простое приложение на Python 3.1, используя PyQt4. Завершая, я хочу, чтобы приложение распространялось на компьютеры без какой-либо из них.

Я почти исключительно беспокоюсь о платформах Windows, поэтому моя цель - получить один исполняемый файл и, возможно, несколько файлов ресурсов и .dll в конце.

Обыскав вокруг, я пришел к выводу, что

  • py2exe поддерживает только Python до версии 2.7
  • pyinstaller поддерживает только Python до версии 2.6
  • cx_Freeze не работает для меня, потому что я продолжаю получать следующую ошибку при попытке выполнить мой успешно собранный двоичный файл:

Y:\Users\lulz\build\exe.win32-3.1>system_shutdown.exe<br />
Traceback (most recent call last):<br />
    File "Y:\Program Files (x86)\Python\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 27, in  exec(code, m.__dict__)<br />
    File "Y:/Users/lulz/Documents/Coding/Python3/projects/System Shutdown/system_shutdown.pyw", line 5, in  from PyQt4 import QtCore<br />
    File "ExtensionLoader_PyQt4_QtCore.py", line 16, in  AttributeError: 'NoneType' object has no attribute 'modules'

Итак, моя проблема в основном две проблемы здесь:

  1. Есть ли другой способ, кроме cx_Freeze, для создания бинарных файлов с моей конфигурацией?
  2. Если нет, то в чем может быть проблема cx_Freeze?

При необходимости я могу предоставить дополнительную информацию по второй проблеме, например, мой вызов cx_Freeze, мой скрипт установки distutils и т. Д.

Спасибо вам уже за помощь и комментарии.

Ответы [ 2 ]

13 голосов
/ 19 ноября 2009

Это можно исправить, добавив одну строку кода в freeze.py в вашем пакете cx_Freeze.

Это описано здесь: http://www.mail-archive.com/cx-freeze-users@lists.sourceforge.net/msg00212.html

у меня сработало как минимум:)

Ура, Альмар

1 голос
/ 22 января 2016

Для Python 3.3 и более поздних версий здесь есть хорошее разрешение: py2exe - генерирует один исполняемый файл

Установить py2exe:

pip install py2exe

Затем добавьте помимо файла your_script.py следующий файл Make_exe.py:

from distutils.core import setup
import py2exe, sys

class Make_exe():
    def __init__(self, python_script):
        sys.argv.append('py2exe')

        setup(
            console=[{'script': python_script}],
            zipfile = None,
            options={
                'py2exe': 
                {
                    'bundle_files': 1, 
                    'compressed': True,
                    # Add includes if necessary, e.g. 
                    'includes': ['lxml.etree', 'lxml._elementpath', 'gzip'],
                }
            }
        )

if __name__ == '__main__':
    Make_exe('your_script.py')

И если вы хотите, чтобы 'your_script.py' перестраивал себя как 'your_script.exe' каждый раз, когда вы запускаете его в python , вы можете добавить в его main: 1015 *

import subprocess
import sys

if __name__ == '__main__':
    currentFile = sys.argv[0]
    if currentFile.lower().endswith(".py"):
        exitCode = subprocess.call("python Make_exe.py")
        if exitCode==0 :
            dirName = os.path.dirname(currentFile)
            exeName = os.path.splitext(os.path.basename(currentFile))[0] + '.exe'
            exePath = dirName + "/dist/" + exeName
            cmd = [exePath] + sys.argv[1:]
            print ("Executing command:\n %s" % cmd)
            exitCode = subprocess.call(cmd)
        sys.exit(exitCode)
    else:
        print ("This will be executed only within the new generated EXE File...")
...