【问题标题】:System path error with PyQt and Py2exePyQt 和 Py2exe 的系统路径错误
【发布时间】:2013-07-07 03:46:18
【问题描述】:

我的问题:

我遇到了这个问题,如果我尝试在使用 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.

我的 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_()

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

就是这样,感谢您提前提供任何答案。

【问题讨论】:

  • 我现在也遇到了同样的问题,但没人能给出提示...
  • 顺便找到解决办法了吗?
  • @foresightyj 我得到一个不同的错误,但来自同一位置,使用 Python 3.3.2 和 PySide 1.2.0。我在 Qt 论坛上发布了question,希望我们中的一个人能得到答案。
  • @Praetorian 我正在使用 Python 2.7.5。我还尝试登录并在 pyqt 的论坛上发布问题,但我能够找到一个可以开始新帖子的帖子......到目前为止,我的修复似乎工作正常。希望他们能尽快解决。

标签: python pyqt exe pyside py2exe


【解决方案1】:

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

try:
    _setupQtDirectories()
except WindowsError:
    pass

我承认这很丑。我希望 PySide 的人能尽快解决这个问题。

【讨论】:

  • 我以稍微不同的方式对其进行了修复,仅当应用程序未冻结时才调用该函数。 if not hasattr(sys, 'frozen'): _setupQtDirectories()
  • 在我们随意跳过这个函数之前 - 它有什么意义?
  • 我想补充一点,我已经按照 Praetorian 的建议修改了函数,它似乎已经解决了我的问题......但我仍然很想听听这个函数的意义。也许这应该放在 StackOverflow 上的一个单独问题中。
  • @ArtOfWarfare 我从来没有时间弄清楚。但是在使用它的两个月里,我从来没有遇到过任何问题。
【解决方案2】:

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

【讨论】:

  • 安装 PySide v1.2.1(从 1.2.0 开始)并没有解决我的问题。
  • 是的。今天用 Pyside V1.2.1 又遇到了同样的错误
【解决方案3】:

对于 PySide 1.2.1: 修复 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 或其他“冻结器”时,_utils.py 中的 __file__ 值将指向 zip 存档中的文件,这显然不是 PySide 所期望的。因此,您必须处理这种情况并强制 _utils.py 使用 PySide dll 和东西真正存在的路径(在我的情况下 - 一个目录,其中放置 .exe 文件)。

【讨论】:

  • 这对我有用,谢谢。我在 _utils.py 中看到了关于 64 位环境的 get_pyside_dir 的第二个定义。是否也应该对此进行修改,还是问题仅与 32 位有关?我安装了 Python 2.7 32bit,所以现在无法测试。
  • 是的,所有出现的 get_pyside_dir 都必须修复。我编辑了我的答案来处理这两种情况:win32 和其他 - 你可以使用它。
【解决方案4】:

我尝试安装 PySide 1.2.1 仍然遇到这个问题。

我刚刚更改了PySide._utils 中的get_pyside_dir() 函数以返回我的pyside 路径,对我来说是“C:\Python27\Lib\site-packages\PySide”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2014-10-31
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2017-02-05
    相关资源
    最近更新 更多