python - tuple - pyinstaller
Error de ruta del sistema con PyQt y Py2exe (4)
Mi problema:
Tengo este problema donde si trato de ejecutar py2exe en mi archivo python que usa Pyqt / Pyside, aparece el siguiente error cuando intento ejecutar el EXE generado en I: / Documents / Python / Buttonio_Testio / dist:
Error recibido al ejecutar Package.exe:
I:/Documents/Python/Buttonio_Testio/dist>Package.exe
Traceback (most recent call last):
File "Package.py", line 1, in <module>
File "PySide/__init__.pyc", line 55, in <module>
File "PySide/__init__.pyc", line 11, in _setupQtDirectories
File "PySide/_utils.pyc", line 87, in get_pyside_dir
File "PySide/_utils.pyc", line 83, in _get_win32_case_sensitive_name
File "PySide/_utils.pyc", line 58, in _get_win32_short_name
WindowsError: [Error 3] The system cannot find the path specified.
Mi setup.py se ve así:
from distutils.core import setup
import py2exe
setup(console=[''Package.py''])
My program, in Package.py looks like this:
from PySide.QtCore import *
from PySide.QtGui import *
import sys
import Gui
class Ui_Dialog(QDialog, Gui.Ui_Dialog):
#Setupui and function afterwards generated converting XML file made by QT Desiner to python.
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(279, 295)
self.textBrowser = QtGui.QTextBrowser(Dialog)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 256, 192))
self.textBrowser.setObjectName("textBrowser")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(10, 210, 251, 71))
self.pushButton.setObjectName("PushButton")
self.retranslateUi(Dialog)
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.textBrowser.clear)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "Clear Spam", None, QtGui.QApplication.UnicodeUTF8))
def __init__(self, parent=None):
super(Ui_Dialog, self).__init__(parent)
self.setupUi(self)
self.spam()
def spam(self):
self.textBrowser.append("SPAM")
self.textBrowser.append("SPAM")
self.textBrowser.append("SPAM")
self.textBrowser.append("LOL")
self.textBrowser.append("I")
self.textBrowser.append("AM")
self.textBrowser.append("SPAMMING")
self.textBrowser.append("MYSELF")
app = QApplication(sys.argv)
form = Ui_Dialog()
form.show()
app.exec_()
Estoy ejecutando Windows 8 con 32 bits python y módulos de 32 bits instalados. El archivo setup.py estaba en la misma carpeta que Package.py cuando ejecuté setup.py en Símbolo del sistema. Además de eso, no sé qué otra información puede ayudar a solucionar mi problema.
Eso es todo, gracias por cualquier respuesta de antemano.
Estaba buscando desesperadamente una solución para esto durante las últimas tres horas. Terminé yendo al archivo _ _ init_ _.py en el directorio C: / Python27 / Lib / site-packages / PySide. Cambié la última línea a lo siguiente:
try:
_setupQtDirectories()
except WindowsError:
pass
Es feo, lo admito. Espero que la gente de PySide solucione esto pronto.
El problema fue que _utils.py usó __file__
, pero __file__
no está disponible en ejecutables congelados. Esto se ha corregido en PySide 1.2.1 que se lanzó hace unos días (fue corregido por commit 817a5c9bd39d3a22e2a7db9aa497059be57d58d7 ).
Intenté instalar PySide 1.2.1 y todavía tengo este problema.
Acabo de cambiar las funciones get_pyside_dir()
en PySide._utils
para devolver mi ruta a pyside, que para mí es "C: / Python27 / Lib / site-packages / PySide"
para PySide 1.2.1: arregle la función get_pyside_dir()
en PySide / _utils.py:
if sys.platform == ''win32'':
...
def get_pyside_dir():
is_frozen = hasattr(sys, ''frozen'')
try:
from . import QtCore
except ImportError:
s1 = sys.argv[0] if is_frozen else __file__
return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(s1)))
else:
s2 = sys.argv[0] if is_frozen else QtCore.__file__
return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(s2)))
else:
def get_pyside_dir():
is_frozen = hasattr(sys, ''frozen'')
try:
from . import QtCore
except ImportError:
s1 = sys.argv[0] if is_frozen else __file__
return os.path.abspath(os.path.dirname(s1))
else:
s2 = sys.argv[0] if is_frozen else QtCore.__file__
return os.path.abspath(os.path.dirname(s2))
Al usar py2exe u otro "congelador", el valor de _utils.py
en _utils.py
apuntará al archivo dentro del archivo zip, que obviamente PySide no espera. Así que tienes que manejar este caso y forzar _utils.py
a usar una ruta, donde PySide dlls y demás cosas están realmente vivos (en mi caso, un directorio, donde se coloca el archivo .exe).