使用Pyinstaller打包kivy应用程序

时间:2017-03-26 12:25:39

标签: windows-7 kivy pyinstaller

我在Kivy网站instructions之后遇到了很多麻烦,许多步骤都没有解释为我应该如何回答警告。

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没有太多信息。

3 个答案:

答案 0 :(得分:2)

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

http://pythonhosted.org/PyInstaller/

提供了一些信息

截至2017年3月的Python 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并选择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步:添加隐藏模块

当我点击myapp.exe中的dist/MyApp时,应用程序崩溃了。在日志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小部件。

答案 1 :(得分:1)

所以,行:

  

所有内容都将被删除!

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

这两种类型的附加文件:

  • kivy dependencies
  • 申请数据

依赖关系只是二进制文件(+/-加载器,许可证等),您可以通过*[Tree(p) ...]代码获取它们,这只是“从该文件夹中获取所有文件”的命令。没有他们,基维甚至都不会开始。

与此类似,第二个Tree(<app folder>)执行相同操作,但对于您自己的文件,例如.py文件,.kv文件,图像,音乐,数据库,基本上是创建。

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

答案 2 :(得分:0)

如果在spec文件的'a = Analysis ...'块中有一个替代项,则也可以使用

hiddenimports=[]

hiddenimports=['win32file', 'win32timezone']

对于win32file,win32timezone或缺少的任何文件