Python 3 + pyQt5 + cx_freeze
过去的一天基本上都是在烦恼中度过。我正在尝试创建我的第一个pyQt5应用程序,并将其打包成OSX应用。以下是我到目前为止的努力历程:
- 发现PyQt5只能在Python3上安装。于是通过Homebrew安装了Python3和pyQt。
- 开发了应用程序。在PyCharm中启动时一切正常。
- 由于PyCharm的pip安装器失败,我从源代码安装了cx_freeze到Python3。
- 尝试用cx_freeze打包应用程序,却遇到了语法错误。按照以下建议解决了这个问题,建议是关于pyQt5的:使用cx_freeze打包PyQt应用时的语法错误
查看了cx_freeze的教程:http://www.pythonschool.net/cxfreeze_mac/,并根据示例创建了一个setup.py:
application_title = "simple_PyQt4" #what you want to application to be called main_python_file = "main.py" #the name of the python file you use to run the program import sys from cx_Freeze import setup, Executable base = None if sys.platform == "win32": base = "Win32GUI" includes = ["atexit","re"] setup( name = application_title, version = "0.1", description = "Sample cx_Freeze PyQt4 script", options = {"build_exe" : {"includes" : includes }}, executables = [Executable(main_python_file, base = base)])
用“bdist_mac”参数运行cx_freeze。这次生成了.app文件。然而,它无法启动。点击时什么也看不见,也没有任何错误信息。就是完全无法启动。
到这个时候,我真的对这一切感到很疲惫,所以请帮帮我。如果可以的话,请帮我: 1. 用Homebrew安装PyQt5到Python2.7(我试过,但没搞明白),这样我就可以使用与Python2兼容的打包工具。 2. 让打包过程正常工作。如果可能的话,请给我详细的解释,我对这些工具还很陌生。
我也想听听大家是如何用pyQt5部署独立应用的,因为这个过程看起来一点也不简单。
编辑:我按照ThomasK的建议在文件夹中运行了结果“main”。我得到了以下错误,但不知道这是什么意思:
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.3.4/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/cx_Freeze-4.3.2-py3.3-macosx-10.9-x86_64.egg/cx_Freeze/initscripts/Console3.py", line 27, in <module>
exec(code, m.__dict__)
File "main.py", line 8, in <module>
File "/usr/local/Cellar/python3/3.3.4/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 "/usr/local/Cellar/python3/3.3.4/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1512, in _find_and_load_unlocked
_call_with_frames_removed(import_, parent)
File "/usr/local/Cellar/python3/3.3.4/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 313, in _call_with_frames_removed
return f(*args, **kwds)
File "/usr/local/Cellar/python3/3.3.4/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 "/usr/local/Cellar/python3/3.3.4/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1529, in _find_and_load_unlocked
raise exc
ImportError: No module named 'ui'
在main.py的第8行我有这个导入:
from ui.main import Ui_MainWindow
我在项目目录下的“ui”文件夹中有所有的.ui文件及其对应的.py文件。
编辑:打包过程的输出:http://pastebin.com/RR9pNGfR 编辑:还有我的项目结构:http://pastebin.com/HmsdNXEb
1 个回答
我不知道最开始提问的人解决问题的进展如何,而且提到的那些链接早就被删掉了,所以没有太多额外的信息。不过,在2014年8月27日更新的最新版本的cx_freeze
使用说明中提到:
不幸的是,当前版本的cx_Freeze在Mac OS X上与从Python.org或PyQt安装的Python版本不太兼容,特别是如果你之前是按照我们的说明安装的。因此,为了确保cx_Freeze能够成功安装,你需要使用一个叫做MacPorts的包管理工具来安装Python和PyQt。
所以,这可能一直都是问题所在。通过“Homebrew”安装Python3和PyQt,听起来也可能导致了配置上的问题。