Pergunta

Eu construí um aplicativo bastante simples no Python 3.1 usando o PYQT4. Feito, quero que o aplicativo seja distribuído aos computadores sem nenhum deles instalado.

Eu me preocupo quase exclusivamente com as plataformas do Windows, então meu objetivo é ter um único arquivo executável e talvez alguns arquivos de recursos e .dlls no final.

Depois de procurar, cheguei à conclusão de que

  • py2exe Somente suporta Python até a versão 2.7
  • pyinstaller Somente suporta Python até a versão 2.6
  • cx_freeze Não funciona para mim porque continuo recebendo o seguinte erro ao tentar executar meu binário de construção com sucesso:

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

Portanto, meu problema é basicamente dois problemas aqui:

  1. Existe outra maneira além de cx_freeze para construir binários com minha configuração?
  2. Caso contrário, qual seria o problema CX_FREEZE?

Eu posso fornecer mais informações sobre o segundo problema, se necessário, como minha chamada de cx_freeze, meu script de configuração de distutils etc.

Obrigado já pela sua ajuda e comentários.

Foi útil?

Solução

Você pode corrigir isso anexando uma linha de código para congelamento.py no seu pacote cx_freeze.

É descrito aqui:http://www.mail-archive.com/cx-gorze-users@lists.sourceforge.net/msg00212.html

Funcionou pelo menos para mim :)

Saúde, Almar

Outras dicas

Para o Python 3.3 e mais tarde, há uma boa resolução aqui:py2exe - gerar um único arquivo executável

Instale o PY2EXE:

pip install py2exe

Em seguida, adicione além do arquivo 'your_script.py', o seguinte arquivo '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')

E se você quiser fazer 'your_script.py' reconstruir -se como 'your_script.exe' Cada vez que você o executa em Python, você pode adicionar ao seu principal:

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...")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top