我有一个用Python编写的应用程序,用PyInstaller“编译”。 它也使用PyQt的GUI框架。
在主窗口加载并显示之前,运行此应用程序具有约10秒的延迟。 据我所知,这不是由于我的代码缓慢。 相反,我怀疑这是由于Python运行时初始化。
问题是这个应用程序是由一个自定义的laucncher /任务栏应用程序启动的。 用户将点击button启动应用程序,看不到任何事情发生,并在另一个应用程序的其他地方点击。 当我的应用程序显示它的窗口时,由于SetForegroundWindow的规则,它不能到达前台。
我可以访问PyInstaller win32加载器,Python代码甚至是启动器代码。
我的问题是:
我怎样才能使这个应用程序启动更快?
如何衡量stream程生命周期头几秒钟的时间?
在第一个窗口显示之前,什么是减less时间的普遍接受的技术?
我想避免添加启animation面有两个原因 – 一个,我希望它不会(在Python代码运行之前的开销)和两个,我只是不喜欢闪屏:)
如果我需要的话,我可能可以编辑PyInstaller加载程序存根创build一个窗口,但这是另一个我宁愿不采取的路线。
感谢您的build议。
我使用py2exe和cx_Freeze“编译”了一些wxPython应用程序,它们中的任何一个都不需要超过4秒钟就可以启动。
我从来没有使用pyQT,但与wxPython的启动速度是好的,第一次初始化后,如果我关闭并再次打开,它比第一次更快。
告诉PyInstaller创建一个控制台模式的可执行文件。 这给你一个你可以用来调试的工作控制台。
在主脚本的顶部,即使在第一次导入运行之前,添加一个打印“Python代码开始”。 然后从命令行运行打包的可执行文件。 通过这种方式,您可以清楚地了解PyInstaller的引导程序或应用程序中所花费的时间。
PyInstaller的引导加载程序在单向模式下通常非常快,但是在单一模式下它可能会慢很多,因为它将所有东西都打包到一个临时目录中。 在Windows上,I / O非常慢,然后你有防病毒,这将要复查所有这些DLL文件。
PyQt本身不是问题。 PyQt由SIP生成,生成非常快的惰性绑定; 导入整个PyQt的速度比任何其他GUI库快,因为它基本上什么都不做:所有绑定到类/函数的绑定是在你访问它们的时候动态创建的,也可以节省大量的内存。
如果您的应用程序在启动时很慢,那么没有PyInstaller也是如此。 在这种情况下,唯一的解决方案是启动屏幕(只导入PyQt,创建QApplication,创建显示屏幕,然后导入程序的其余部分并运行它),或重写代码。 没有细节我就帮不了你
我怀疑你正在使用pyinstaller的“一个文件”模式 – 这种模式意味着它必须在应用程序启动之前将所有的库解压到一个临时目录。 在Qt的情况下,这些库很大,需要几秒钟的时间来解压缩。 尝试使用“单目录”模式,看看是否有帮助?
我同意上面的答案。 使用单文件模式时,我的Qt python程序需要5秒左右的时间才能在一台体面的PC上启动。 在我换成–onedir之后,大概只需要一秒左右的时间。 几乎在用户双击exe文件后立即。 但是缺点是那个目录中有很多文件不够整齐。