【问题标题】:cxFreeze breaks Python application with sc2reader library and multiprocessingcx_Freeze 使用 ec2 阅读器库和多处理破坏 Python 应用程序
【发布时间】:2013-09-19 02:13:34
【问题描述】:

我正在将项目的早期版本移植到 Windows 并将其作为二进制文件分发。到目前为止,该项目是在 Arch Linux 中使用 Python 3.3 开发的,但我想将其打包为 Windows 中的独立二进制文件,以吸引更多的测试受众。我已经确认代码在带有 Python 3.3 的 Windows 中按预期运行。

在尝试使用 cxfreeze 编译它时,我遇到了一些问题。首先,我使用的主库(sc2reader)包含 .csv 文件形式的数据。在 Windows 中,这些文件位于 \Python33\Lib\site-packages\sc2reader 中,但 cxfreeze 在包含与 sc2reader 关联的大多数 .py 文件时忽略了包含它们。最初,生成的可执行文件会立即崩溃,并抱怨这些丢失的数据文件。在手动添加它们之后(我无法让 setup.py 包含这些文件——cxfreeze 不会抱怨任何语法错误,但它也不会包含这些文件),我摆脱了这些错误。

我的 setup.py 看起来像这样:

import sys

from cx_Freeze import setup, Executable

build_exe_options = {"include_files": ['C:\Python33\Lib\site-packages\sc2reader\data\']}

setup(
    name = "vroMAD",
    version = "0.1.0",
    executables = [Executable("__main__.py", base = "base")]

在手动复制文件后,我至少启动了二进制文件。它正确地绘制窗口,但某些行为不正确。文件浏览和文件选择等基本功能有效,仅此而已。窗口中有一个按钮,用于执行长任务并绘制进度条。因为这个漫长的任务会阻止 GUI 更新,所以每当用户按下此按钮时都会产生第二个进程。但是,程序不会继续执行任务并更新进度条,而是创建一个重复的窗口。事实上,任务管理器显示了一个额外的、相同的过程。新窗口的行为与旧窗口完全相同:它可以正确处理基本事件,但是当按下按钮时,它会生成另一个窗口……其行为方式相同。

多处理不能与 cxfreeze 一起使用吗?

【问题讨论】:

    标签: python linux windows multiprocessing cx-freeze


    【解决方案1】:

    你在打电话给multiprocessing.freeze_support吗?

    添加对使用多处理的程序被冻结以生成 Windows 可执行文件时的支持。 (已使用 py2exe、PyInstaller 和 cx_Freeze 测试。)

    需要在主模块的if __name__ == '__main__' 行之后直接调用此函数。例如:

    from multiprocessing import Process, freeze_support
    
    def f():
        print 'hello world!'
    
    if __name__ == '__main__':
        freeze_support()
        Process(target=f).start()
    

    如果freeze_support() 行被省略,那么尝试运行冻结的可执行文件将引发RuntimeError

    如果模块正在由 Python 解释器正常运行,则 freeze_support() 无效。

    另外,你是wrapping all the executing code in if __name__ == '__main__',对吧? multiprocessing 在 Windows 和 Unix 上的行为方式不同(因为缺少 fork())。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 1970-01-01
      • 2014-10-10
      • 2020-04-12
      • 2011-08-31
      • 2019-11-05
      • 2010-12-18
      • 2013-07-06
      • 2015-05-25
      相关资源
      最近更新 更多