0

我正在将项目的早期版本移植到 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 吗?

4

1 回答 1

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()无效。

另外,您将所有执行代码包装在 中if __name__ == '__main__',对吗?multiprocessing在 Windows 和 Unix 上以这种方式表现不同(因为缺少fork())。

于 2013-09-19T02:37:40.307 回答