在MacOSX上使用cx_freeze与PyQT5和Python 3

时间:2014-05-13 00:44:00

标签: macos python-3.x cx-freeze pyqt5

我试图在运行10.9.2的MacOS上使用cx_freeze 4.3.3在一个非常简单的Python 3.3的PyQt5脚本上运行。

不返回任何错误,并输出.app。但是,当从终端运行.app时,我得到错误:

LSOpenURLsWithRole() failed with error -10810

根据Apple的文档是"未知错误"。

我尝试运行的非常简单的代码(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

上面有app返回错误。

所以,阅读我看到它可能是一个与在应用程序中包含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 个答案:

答案 0 :(得分:3)

所以,经过长时间的战斗就是问题:libzmq。 我安装了libzmq并指定了--qt-menu-nib选项,上面的简单示例同时运行:

sudo python setup.py build

sudo python setup.py bdist_mac

分步说明:

我在大多数python33软件包中使用了mac端口,所以我坚持使用它。 Libzmq在macport上不可用,但它的依赖关系是。 所以:

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

然后在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选项,应用程序在启动时崩溃,而构建工作正常。

希望这将有助于将来。

答案 1 :(得分:1)

我遇到了同样的错误,并且使用最新版本的ZMQ(4.0.4)重新编译并没有解决问题。

但是,通过查看/Applications/Utilities/Console.app程序的消息,我可以看到为我的Python程序提供了额外的命令行选项。此命令行选项始终以-psn_0_开头,后跟一个数字。显然psn代表Process Serial Number(参见:http://hintsforums.macworld.com/showthread.php?t=11978)。

我的程序使用argparse包解析命令行参数并退出并显示错误,因为它无法识别-psn选项。我现在在使用argparse解析之前将其过滤掉,这解决了我的问题。