我有这个问题,如果我尝试在我的使用Pyqt / Pyside的python文件上运行py2exe我尝试运行在I中生成的EXE时会出现以下错误:\ Documents \ Python \ Buttonio_Testio \ dist:
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.
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_()
我正在运行安装了32位python和32位模块的Windows 8。当我在命令提示符下运行setup.py时,setup.py文件与Package.py位于同一文件夹中。除此之外,我不知道其他哪些信息可以帮助解决我的问题。
这就是全部,谢谢你提前得到任何答案。
答案 0 :(得分:7)
过去三个小时我一直在拼命寻找解决方案。我最终进入C:\ Python27 \ Lib \ site-packages \ PySide目录中的_ _ init_ _.py文件。我将最后一行更改为以下内容:
try:
_setupQtDirectories()
except WindowsError:
pass
我承认这是丑陋的。我希望PySide人能尽快解决这个问题。
答案 1 :(得分:5)
问题是_utils.py使用了__file__
,但__file__
在冻结的可执行文件中不可用。这在几天前发布的PySide 1.2.1中得到了修复(它由commit 817a5c9bd39d3a22e2a7db9aa497059be57d58d7修复)。
答案 2 :(得分:5)
:
在PySide / _utils.py中修复get_pyside_dir()
函数:
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))
当使用py2exe或其他“freezer”时,__file__
中的_utils.py
值将指向zip存档中的文件,这是PySide绝对不希望的。所以你必须处理这种情况并强制_utils.py
使用一个路径,PySide dlls&amp;东西真的活着(在我的情况下 - 一个目录,放置.exe文件)。
答案 3 :(得分:0)
我尝试安装PySide 1.2.1但仍然遇到了这个问题。
我刚刚更改get_pyside_dir()
中的PySide._utils
函数以返回我的pyside路径,对我而言是“C:\ Python27 \ Lib \ site-packages \ PySide”