如何使用 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
,文件夹也不会被删除。
我还应该总是添加这些行:
from kivy.deps import sdl2, glew
Tree('C:\Users\<username>\Desktop\MyApp\'),
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
在 .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"
这将创建两个文件夹,build
和 dist
,以及一个 .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 或任何丢失的文件
按照instructions Kivy 网站上的表格,我遇到了很多麻烦,很多步骤都没有解释,比如我应该如何回答警告。
WARNING: The output directory "..." and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)
即使我选择 y
,文件夹也不会被删除。
我还应该总是添加这些行:
from kivy.deps import sdl2, glew
Tree('C:\Users\<username>\Desktop\MyApp\'),
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
在 .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"
这将创建两个文件夹,build
和 dist
,以及一个 .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 或任何丢失的文件