3

我有一个相当“繁重”的 python 程序,我想将其编译为 exe。

该程序有相当数量的导入,但使用 PyQT4 框架,我在启动画面可见时加载这些导入。
我使用 pyinstaller(在 cmd 中)将此程序编译为单个 .exe 文件:

python %pycompile_file% --onefile --noconsole --icon=Icon.ico Script.pyw

但是,即使启动画面设置为在导入大量模块时显示(特别是包括 sympy),并且即使在通过 python 运行时它会立即显示并在足够的时间范围内显示;
运行生成的 .exe 会导致在启动画面显示之前出现严重延迟,这只会在整个程序加载之前显示很短的时间。

我的怀疑是从 .pyw 编译到 .exe 加快了实际的“代码”(因此为什么启动画面更短),但减慢了程序执行的实际“开始”。

我该如何解决这个问题,以使 .exe 不会“启动得这么慢”?

(我怀疑编译到 --onefile 贡献很大,但我需要 .exe 文件是所有 .dll 中的一个文件夹,我不知道如何让 pyinstaller 做到这一点)

谢谢!


Windows 7
python 2.7.2
pyinstaller
PyQt4

4

2 回答 2

4

Pyinstaller 不会将 python 代码转换为本地代码,它只是将 python 字节码和字节码解释器打包到一个文件中——一旦启动开销不受影响,实际处理将以完全相同的速度发生。

Pyinstaller 的 --onefile 模式会使您的应用程序启动速度变慢,因为它必须先将所有库解压到一个临时目录中,然后才能加载它们。对于 PyQT,这些库相当大,因此延迟会很明显。使用单目录模式,这样 DLL 不需要解包,应该会快得多。

于 2012-02-07T12:05:57.290 回答
0

解决了;

不要将 .dll 归档到已编译的 .exe 中。
将代码导入的所有文件(您希望用户在不通过 .dll 导航的情况下与之交互)保持上一级,并创建一个指向 .exe 的快捷方式,该快捷方式的工作目录比 .exe 上一级。

您可以使用 pywin32 创建这样的快捷方式。

于 2012-02-08T09:49:49.853 回答