PyQt和Py2exe的系统路径错误

use*_*777 10 python exe pyqt py2exe pyside

我的问题:

我有这个问题,如果我尝试在我的使用Pyqt/Pyside的python文件上运行py2exe我尝试运行在I:\ Documents\Python\Buttonio_Testio\dist中生成的EXE时会出现以下错误:

运行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.
Run Code Online (Sandbox Code Playgroud)

我的setup.py看起来像这样:

    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_()
Run Code Online (Sandbox Code Playgroud)

我正在运行安装了32位python和32位模块的Windows 8.当我在命令提示符下运行setup.py时,setup.py文件与Package.py位于同一文件夹中.除此之外,我不知道其他哪些信息可能有助于解决我的问题.

这就是全部,谢谢您事先得到的答案.

for*_*tyj 7

在过去的三个小时里,我拼命寻找解决方案.我最终进入C:\ Python27\Lib\site-packages\PySide目录中的_ _ init_ _.py文件.我将最后一行更改为以下内容:

try:
    _setupQtDirectories()
except WindowsError:
    pass
Run Code Online (Sandbox Code Playgroud)

我承认这很难看.我希望PySide人能尽快解决这个问题.

  • 我以稍微不同的方式修复它,仅在应用程序未冻结时才调用该函数.`if not notattr(sys,'frozen'):_ setupQtDirectories()` (2认同)

小智 5

问题是使用了_utils.py __file__,但__file__在冻结的可执行文件中不可用.这已经在几天前发布的PySide 1.2.1中得到修复(它由commit 817a5c9bd39d3a22e2a7db9aa497059be57d58d7修复).


Nik*_*iko 5

for PySide 1.2.1:get_pyside_dir()在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))
Run Code Online (Sandbox Code Playgroud)

当使用py2exe或其他"freezer"时,__file__值in _utils.py将指向zip存档中的文件,这是PySide绝对不期望的.所以你必须处理这种情况并强制_utils.py使用一个路径,其中PySide dll和东西真的存在(在我的情况下 - 一个目录,放置.exe文件).