Python 3 + pyQt5 + cx_freeze

2 投票
1 回答
2446 浏览
提问于 2025-04-17 20:37

过去的一天基本上都是在烦恼中度过。我正在尝试创建我的第一个pyQt5应用程序,并将其打包成OSX应用。以下是我到目前为止的努力历程:

  1. 发现PyQt5只能在Python3上安装。于是通过Homebrew安装了Python3和pyQt。
  2. 开发了应用程序。在PyCharm中启动时一切正常。
  3. 由于PyCharm的pip安装器失败,我从源代码安装了cx_freeze到Python3。
  4. 尝试用cx_freeze打包应用程序,却遇到了语法错误。按照以下建议解决了这个问题,建议是关于pyQt5的:使用cx_freeze打包PyQt应用时的语法错误
  5. 查看了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)])
    
  6. 用“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 个回答

1

我不知道最开始提问的人解决问题的进展如何,而且提到的那些链接早就被删掉了,所以没有太多额外的信息。不过,在2014年8月27日更新的最新版本的cx_freeze使用说明中提到:

不幸的是,当前版本的cx_Freeze在Mac OS X上与从Python.org或PyQt安装的Python版本不太兼容,特别是如果你之前是按照我们的说明安装的。因此,为了确保cx_Freeze能够成功安装,你需要使用一个叫做MacPorts的包管理工具来安装Python和PyQt。

所以,这可能一直都是问题所在。通过“Homebrew”安装Python3和PyQt,听起来也可能导致了配置上的问题。

撰写回答