在MacOSX上使用cx_freeze、PyQT5和Python 3

3

我正在尝试在运行MacOS10.9.2的计算机上,使用cx_freeze 4.3.3打包一个很简单的Python 3.3 PyQt5脚本。

虽然没有报错信息并且已经成功生成了.app程序文件。但是当我在终端运行程序时,出现了以下错误:

LSOpenURLsWithRole() failed with error -10810

据苹果文档显示,该错误为“未知错误”("Unknown Error")。 我尝试运行的非常简单的代码(PyQt5app.py)如下:
import sys
from PyQt5.QtWidgets import QApplication, QDialog

app = QApplication(sys.argv)
form = QDialog()
form.show()
app.exec_()

文件setup.py是:
import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

options = {
    'build_exe': {
        'excludes': ['Tkinter']  # Sometimes a little finetuning is needed
    }
}

executables = [
    Executable('PyQt5app.py', base=base)
]

setup(name='PyQt5app',
      version='0.1',
      description='Sample PyQt5 GUI',
      executables=executables,
      options=options
      )

当我运行时调用:

sudo python cx_freeze bdist_mac

获取此日志:http://pastebin.com/VBxyyBRn

应用程序返回以上错误。

因此,通过阅读我发现这可能与在应用程序中包含qt文件有关(或者至少在PyQt4上是这个问题),因此我尝试指定qt-menu-nib目录:

sudo python setup.py bdist_mac --qt-menu-nib=/Users/franco/Qt5.2.1/5.2.1/clang_64/plugins/platforms/

获取此日志:http://pastebin.com/TpRdrSmT 但是出现了相同的错误。
如果我从PyQt5app.app/Contents/MacOS/PyQt5app运行应用程序,则会出现大量引导错误:
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/cx_Freeze-4.3.3-py3.3-macosx-10.9-x86_64.egg/cx_Freeze/initscripts/Console.py", line 27, in <module>
    exec(code, m.__dict__)
  File "PyQt5app.py", line 5, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1565, in _find_and_load
    return _find_and_load_unlocked(name, import_)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1532, in _find_and_load_unlocked
    loader.load_module(name)
  File "ExtensionLoader_PyQt5_QtWidgets.py", line 22, in <module>
  File "ExtensionLoader_PyQt5_QtWidgets.py", line 14, in __bootstrap__
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1565, in _find_and_load
    return _find_and_load_unlocked(name, import_)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1532, in _find_and_load_unlocked
    loader.load_module(name)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 584, in _check_name_wrapper
    return method(self, name, *args, **kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 495, in set_package_wrapper
    module = fxn(*args, **kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 508, in set_loader_wrapper
    module = fxn(self, *args, **kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1132, in load_module
    fullname, self.path)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 313, in _call_with_frames_removed
    return f(*args, **kwds)
SystemError: initialization of sip raised unreported exception

毫无疑问,当从终端启动脚本时,它能够正常工作:
python PyQt5app.py

我肯定做错了什么,所以,请问有人能帮帮我吗?

2个回答

3

经过长时间的寻找,问题出在了libzmq上。我已安装了libzmq并指定了--qt-menu-nib选项,上述简单示例可在两个环境下运行:

sudo python setup.py build

并且

sudo python setup.py bdist_mac

步骤说明:

我在大部分 Python33 包上都使用了 MacPorts,所以我继续使用它来安装剩下的内容。

Libzmq 在 MacPorts 上不可用,但其依赖项是可用的。

1) 安装 libtool、autoconf 和 automake:

sudo port install libtool
sudo port install autoconf
sudo port install automake

2) 从https://github.com/zeromq/libzmq下载最新版本的libzmq (我为了方便下载了ZIP文件),然后解压缩并进入该文件夹。

/libzmq-master

现在,如果您已经安装了所有的依赖项,那么文件夹中提供的INSTALL文档中的说明非常清晰明了。运行以下命令:

sudo ./autogen.sh
sudo ./configure
sudo make
sudo make install

3) 从https://bitbucket.org/anthony_tuininga/cx_freeze/downloads下载最新的cx_freeze,然后解压缩/解包,导航到文件夹并运行:

sudo python setup.py build
sudo python setup.py install

现在,在编译使用Python3.3和PyQt5的MacOSX代码时,您可以运行以下命令:
sudo python setup.py build

然后进入构建文件夹并运行以下命令来启动程序:

./nameoftheprogram

确认无误后,使用以下命令构建应用程序或DMG文件(根据您的喜好):

sudo python setup.py bdist_mac --qt-menu-nib=/Users/username/Qt5.2.1/5.2.1/clang_64/plugins/platforms/

这里的路径是指您的Qt5安装路径。如果我不使用--qt-menu-nib选项,应用程序将在启动时崩溃,而构建工作正常。

希望这能帮助今后的某个人。


嗨HeoN,这听起来就像我正在寻找的详细步骤,但是请原谅,我对此很陌生,您可以通过Twitter联系我吗? 因为我遇到了麻烦,或者您可以分享另一个更详细的教程吗? 我的Twitter用户名是@Lexynux,我保证不会太多次地打扰你。感谢您提供的所有信息,我现在要尝试一下! - alexventuraio

1
我遇到了相同的错误,使用最新版本的ZMQ(4.0.4)重新编译并不能解决问题。然而,在查看/Applications/Utilities/Console.app程序的消息时,我发现给我的Python程序传递了一个额外的命令行选项。这个命令行选项总是以-psn_0_开头,后面跟着一个数字。显然,psn代表进程序列号(参见:http://hintsforums.macworld.com/showthread.php?t=11978)。我的程序使用argparse包解析命令行参数,并因为无法识别-psn选项而退出。现在,我在解析之前过滤掉它,就解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接