2009-11-15 11 views
21

Creé una aplicación bastante simple en Python 3.1 usando PyQt4. Una vez hecho, quiero que la aplicación se distribuya a las computadoras sin ninguno de los instalados.Construcción de ejecutables para Python 3 y PyQt

Me preocupan casi exclusivamente las plataformas Windows, por lo que mi objetivo es tener un solo archivo ejecutable y tal vez algunos archivos de recursos y .dlls al final.

haber buscado en torno, llegué a la conclusión de que

  • py2exe sólo es compatible con Python hasta la versión 2.7
  • PyInstaller sólo es compatible con Python hasta la versión 2.6
  • cx_Freeze hace no funciona para mí porque sigo recibiendo el siguiente error al intentar ejecutar mi compilación binaria exitosa:

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'

Así que mi problema es básicamente dos problemas:

  1. ¿Hay otra manera pero cx_Freeze construir binarios con mi configuración?
  2. Si no, ¿cuál podría ser el problema de cx_Freeze?

puedo proporcionar más información sobre el segundo problema, si es necesario, al igual que mi llamada de cx_Freeze, mi distutils configuración guión etc.

Gracias ya por su ayuda y comentarios.

+0

Buena pregunta. py2exe ha sido excelente para nuestros propósitos en el pasado. –

+0

¡py2exe ya está disponible para Python 3 a partir de ahora! –

Respuesta

13

Puede solucionar esto agregando una línea de código a freeze.py en su paquete cx_Freeze.

Se describe aquí: http://www.mail-archive.com/[email protected]/msg00212.html

Se trabajó para mí por lo menos :)

Cheers, Almar

+0

Lo intentaré tan pronto como lo encuentre y publique los resultados. ¡Gracias hasta ahora! – WrongAboutMostThings

+0

Esto finalmente funcionó, tuvo que agregar la línea de código que mencionó e incluir sip. Ahora queda la pregunta de cómo suprimir la ventana de la consola al iniciar mi buena aplicación GUI. – WrongAboutMostThings

+3

Un poco tarde, pero para los lectores futuros, puede suprimir la ventana de la consola congelando con la base Win32GUI. [Ejemplo aquí] (http://cx_freeze.readthedocs.org/en/latest/cxfreeze_distutils.html). –

1

Para Python 3.3 y después, hay una buena resolución aquí: py2exe - generate single executable file

Instalar py2exe:

pip install py2exe 

A continuación, añada además de archivos 'your_script.py', el siguiente fichero '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') 

Y si usted quiere hacer 'your_script.py' reconstruirse como 'your_script.exe 'cada vez que se ejecuta en Python, se puede añadir a su 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...")