如何使用 Pyinstaller 打包 Kivy 应用程序

How to package a Kivy app with Pyinstaller

按照instructions Kivy 网站上的表格,我遇到了很多麻烦,很多步骤都没有解释,比如我应该如何回答警告。

WARNING: The output directory "..." and ALL ITS CONTENTS will be REMOVED! Continue? (y/n) 

即使我选择 y,文件夹也不会被删除。

我还应该总是添加这些行:

在 .spec 文件中?为什么需要它们?

可用于 Kivy 的信息不多。

因此,行:

ALL ITS CONTENTS will be REMOVED!

是的,它将被删除 AND 稍后用新文件替换。检查日期。我认为它会打印 permission denied 如果它不能对文件和整个文件夹都做这么薄,所以你会注意到它。不过这很重要,因为您需要将其他文件添加到您的文件夹中。

另外两种类型的文件:

  • kivy 依赖项
  • 申请资料

依赖项只是二进制文件(+/- 加载程序、许可证等),您可以通过 *[Tree(p) ...] 代码段获取它们,这只是 "get all files from that folder" 的命令。没有他们,Kivy 甚至都不会开始。

与此类似,第二个 Tree(<app folder>) 做同样的事情,但对于您自己的文件,例如 .py 文件、.kv 文件、图像、音乐、数据库,基本上任何 创造。

显然,如果您删除 deps,应用程序将无法启动,如果您删除应用程序数据,您将遇到一些路径错误并且很可能会崩溃。你不想要这些 :P

因为我花了很多时间来了解应该如何打包我的应用程序,所以这里有一些对我很有帮助的说明。

部分信息可在 http://pythonhosted.org/PyInstaller/

Python 2017 年 3 月 3.6 因为打包我的应用程序时出现错误 IndexError: tuple index out of range,我必须安装 PyInstaller 的开发版本:

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

第 1 步:

我将 MyApp 的所有文件移动到文件夹 "C:\Users\<username>\Desktop\MyApp" 中:.py.kv 和图像,我创建了一个 icon.ico . 我创建了另一个文件夹 C:\Users\<username>\Desktop\MyPackagedApp。在此文件夹中,我按 Shift+right click 和 select open command window here

然后我粘贴了这个:

python -m PyInstaller --name MyApp --icon "C:\Users\<username>\Desktop\MyApp\icon.ico" "C:\Users\<username>\Desktop\MyApp\myapp.py"

这将创建两个文件夹,builddist,以及一个 .spec 文件。在dist/MyApp中,我可以找到一个.exe。显然,如果我的应用程序非常简单(只有一个标签),那么打包后的应用程序可以在没有第 2 步的情况下运行。

第 2 步:

第二步涉及编辑 .spec 文件。 Here 就是我的一个例子。 (参见第 3 步,有关 my_hidden_modules 的解释)

我回到 cmd,然后输入

python -m MyApp myapp.spec

然后我收到这个警告:

WARNING: The output directory "..." and ALL ITS CONTENTS will be REMOVED! Continue? (y/n) 

我输入y然后按enter

因为我选择了 y,所以我很惊讶文件夹 build 仍然存在,并且 dist/MyApp 仍然包含许多文件。但这是正常的。 PyInstaller 可以输出单个文件 .exe 或包含所有脚本依赖项和可执行文件的单个文件夹。但默认输出是包含多个文件的单个文件夹。

第 3 步:添加隐藏模块

当我点击 dist/MyApp 中的 myapp.exe 时,应用程序崩溃了。在日志 C:\Users\.kivy\logs\ 中,我可以找到 2 个错误:ModuleNotFoundError: No module named 'win32timezone'SystemError: <class '_frozen_importlib._ModuleLockManager'>。 因此,我不得不编辑 .spec 文件并添加这些行:

my_hidden_modules = [
         ( 'C:\Users\<username>\AppData\Local\Programs\Python\Python36\Lib\site-packages\win32\lib\win32timezone.py', '.' )
         ]

a = Analysis我把datas = []改成了datas = my_hidden_modules,

显然这是因为我使用了 FileChooser 小部件。

如果在 spec 文件的 'a = Analysis...' 块中替换

,它也有效
hiddenimports=[]

hiddenimports=['win32file', 'win32timezone']

对于 win32file、win32timezone 或任何丢失的文件