pyqt4 + pyyaml/ruamel.yaml 转储 + pyinstaller 捆绑中断应用程序

pyqt4 + pyyaml/ruamel.yaml dump + pyinstaller bundling breaks application

我对某些特定行为感到困惑,找不到一些有助于我理解错误的信息。

情况如下:我制作了一个小型 pyqt4 应用程序,它在某些时候使用 pyyamlruamel.yamlOrderedDict 转储到 yaml 字符串(已尝试both) 并将其写入文件,或从该文件中读取。这可以很好地正常执行代码。现在我想通过使用 pyinstaller.

将其捆绑到单个文件 windows exe 来分发我的应用程序

现在,如果我在 pyqt4 形式的方法中直接使用 yaml.dump()ruamel.yaml.dump() class 来生成 yaml 字符串并写入文件(使用 with open ... 的标准方式),我可以使用 pyinstaller 捆绑应用程序并且 exe 运行良好。

但是,如果我在 sub-folder/module 中编写一个小函数,它使用对 pyyaml (yaml.dump(dict)) 或 ruamel.yaml (ruamel.yaml.dump(dict, Dumper=ruamel.yaml.RoundTripDumper)) 的完全相同的调用来生成yaml 字符串并使用 with open ... 保存到文件并在我的 pyqt4 方法中使用它(我只是想让事情更具可读性),pyinstaller 开始加载一堆模块并执行更多的东西(根据控制台输出),导致 exe 文件几乎大了 5 倍,而且无法使用,在开始时抛出致命错误 pyi_rth_pkgres returned -1

不幸的是,我对控制台输出或警告日志了解不多,可见 in this gist。也许我正在寻找错误的术语。我还尝试重命名模块以防止阴影。

现在我的问题是,有人知道发生了什么事并且可以解释这种行为吗?

经过反复试验,我终于成功了。

我创建了一个新模块并在其中构建了转储功能。 pyinstaller 和捆绑的 exe 工作完美。但是,如果我在前一个模块中做完全相同的事情,即使重构名称,它也不起作用。我什至将完整的代码复制到旧模块,但它不起作用。我不知道为什么,在这一点上我不敢问:|

我很高兴它现在能用了。