cx_freeze构建从命令行运行但在单击时死亡的Mac程序

时间:2015-04-05 15:12:31

标签: macos python-2.7 pyqt4 cx-freeze app-bundle

我有一个Python 2.7 / PyQt4程序,我试图用cx_freeze冻结。该程序还使用请求,串行,xml.etree.ElementTree和集合。使用cxfreeze-quickstart-2.7生成的未修改的setup.py,我可以使用macports中的Python在Yosemite中成功构建一个控制台程序(python setup.py build)和.app(python setup.py bdist_mac)。如果我直接从app bundle或dist运行程序:

$ build/MacDISE-1.0.app/Contents/MacOS/macdise
$ dist/macdise

它完全按预期运行。如果我从命令行打开:

$ open -a /Users/jeffemandel/macdise/build/MacDISE-1.0.app

我得到了可怕的

LSOpenURLsWithRole() failed for the application /Users/jeffemandel/macdise/build/MacDISE-1.0.app with error -10810.

我处理了Dan McCombs提出的一些潜在问题(distutils.util.get_platform,sys.arg),但这些似乎不是问题所在。通过暴力试验和错误,我发现如果我将所有代码放在一个单独的模块中,只需导入该模块(而不实际调用它)会导致10810错误,所以我认为它是从命令运行时找到一个库行,但不是从应用程序。我把dist目录放在一个拇指驱动器上并在没有安装Python,Qt4等的另一台Mac上运行它,并得到了这个:

packages/cx_Freeze/initscripts/Console.py", line 27, in <module> File "macdise.py", line 4, in <module>
File "ExtensionLoader_PyQt4_QtGui.py", line 11, in <module>
ImportError: dlopen(/Volumes/NO NAME/dist/PyQt4.QtGui.so, 2): Library not loaded: /opt/local/Library/Frameworks/QtGui.framework/Versions/4/QtGui
Referenced from: /Volumes/NO NAME/dist/PyQt4.QtGui.so
Reason: image not found

当我查看dist时,有一个文件QtGui与/ opt中的文件大小相同。所以似乎失败是dlopen(PyQt4.QtGui.so)返回一个硬编码路径到QtGui库。我猜这个解决方案很简单,但我还没有发现它。

更新:我查看了build / Contents / MacOS / PyQt4中的库。*。所以使用otool,这些都有@executable_path(而不是dist中的硬编码路径)。我的傻瓜。所以我重复了移动程序的过程,只使用MacOS文件夹而不是dist文件夹,并从我妻子的MBP命令行执行macdise。结果问题出现在我寻找included_files的方式上。我改为:

if getattr(sys, 'frozen', False):
    uiName = os.path.join(os.path.dirname(sys.executable), "tabDISE.ui" )
else:
    uiName = "tabDISE.ui"

然后运行。什么本来可以节省我的一种方法是自动转储从命令行执行到控制台日志时生成的错误消息。如果有人知道如何做到这一点,那将是一个很大的帮助。

0 个答案:

没有答案