PyQT/Windows/Pyinstaller (exe) - NameError: el nombre global 'QtGui' no está definido

Tengo un problema al intentar convertir mi código python en un ejecutable usando pyinstaller. Estoy usando PyQT 4.9.1 y Python 2.7.

Recibo el error cuando intento construirlo (Build.py):

Traceback (most recent call last):
  File "Build.py", line 1494, in <module>
    main(args[0], configfilename=opts.configfile)
  File "Build.py", line 1472, in main
    build(specfile)
  File "Build.py", line 1429, in build
    execfile(spec)
  File "c:\projects\vibot\vibotUI_07.py", line 270, in <module>
    window = viUI()
  File "c:\projects\vibot\vibotUI_07.py", line 9, in __init__
    QtGui.QMainWindow.__init__(self)
NameError: global name 'QtGui' is not defined

He buscado en google y todas las soluciones se basan en corregir la importación incorrecta de módulos, pero ya lo hice correctamente para empezar.

Aquí hay una versión recortada de mi código:

#!/usr/bin/env python

import sys
import os
from PyQt4 import QtCore, QtGui

class viUI(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setWindowTitle('test')
        self.setObjectName('viMainWindow')
        self.resize(400, 600)

        self.show()

app = QtGui.QApplication(sys.argv)
window = viUI()
sys.exit(app.exec_())

Este es el archivo Makespec.py:

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'c:\\projects\\vibot\\vibotUI_07.py'],
             pathex=['c:\\Python\\pyinstaller-1.5.1\\pyinstaller-1.5.1'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'vibotUI_07.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=True )

preguntado el 12 de junio de 12 a las 21:06

1 Respuestas

Me parece que estás llamando a Build.py y pasando tu script como parámetro. Acabo de probar esto para ver qué pasaría y obtuve el mismo resultado que publicaste.

Con el PyInstaller estable actual (1.5.1) necesita crear un archivo de especificaciones primero. En lugar de Build.py, ejecute MakeSpec.py con su secuencia de comandos como argumento. Esto creará un archivo .spec que luego enviará a Build.py.

La documentación muestra las opciones que puede pasar a MakeSpec para cosas como configurar un icono en Windows y configurar las opciones de implementación. Todas estas opciones van en el archivo de especificaciones, por lo que solo necesita volver a llamar a Build.py cuando necesite reconstruir su aplicación.

Respondido el 13 de junio de 12 a las 08:06

Estoy usando Makespec.py antes que Build.py, lo siento si omití demasiada información. - VII

¿Está ejecutando Build.py en el archivo .spec que crea Makespec.py? - Gary Hughes

Estoy seguro. Editaré en el archivo Makespec.py, tengo la sensación de que tal vez ingresé algo incorrectamente para que no encuentre el módulo pyqt. - VII

Ahh, leí mal lo que preguntaste, estaba ejecutando la compilación en el archivo python ordinario. Lo siento por eso, mi cerebro ha sido mucho últimamente! Gracias por tu ayuda. - VII

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.