如何从我的 kivy 应用程序(Pyinstaller)获取 Windows 可执行文件?

Posted

技术标签:

【中文标题】如何从我的 kivy 应用程序(Pyinstaller)获取 Windows 可执行文件?【英文标题】:How to get an windows executable from my kivy app (Pyinstaller)? 【发布时间】:2016-10-08 08:24:18 【问题描述】:

我已经完成了一个 kivy 应用程序,并使用 buildozer 打包成一个 .apk。事实是,现在我想用 Pyinstaller 为 windows 打包一个 .exe,但我已经意识到这两个程序(buildozer 和 Pyinstaller)的工作方式不同。我一直在寻找可以帮助我获取文件的好教程,但是我看到的所有教程都太简单了,并且没有解释例如如何导入main.py 的外部文件(例如图像)和如何导入外部模块(在 buildozer 中,我必须将我想要的库添加到 apk 文件中才能正常工作)。我在 Ubuntu 中工作(如果我想获得适用于 Windows 的可执行文件,我应该在 Windows 中工作吗?)并且我有添加到我的 .apk 的列表以正常工作。名单是:

requirements = kivy,sqlite3,requests,simplejson,icalendar,datetime,pytz,htmlParser,email,openssl

如果有人能告诉我如何添加其他文件(main.py 是主文件,但我还有 2 个其他文件在 main.py 中导入)我会非常高兴,因为我已经尝试了很多次直到没有工作。

【问题讨论】:

【参考方案1】:

您必须在 Windows 环境中运行 PyInstaller yourfile.spec。 我可以分享一个我正在使用的规范文件作为示例。

# -*- mode: python -*-

import os
from os.path import join

from kivy import kivy_data_dir
from kivy.deps import sdl2, glew
from kivy.tools.packaging import pyinstaller_hooks as hooks

block_cipher = None
kivy_deps_all = hooks.get_deps_all()
kivy_factory_modules = hooks.get_factory_modules()

datas = [
    (join('common', '*.ini'), 'common')
]

# list of modules to exclude from analysis
excludes_a = ['Tkinter', '_tkinter', 'twisted', 'docutils', 'pygments']

# list of hiddenimports
hiddenimports = kivy_deps_all['hiddenimports'] + kivy_factory_modules

# binary data
sdl2_bin_tocs = [Tree(p) for p in sdl2.dep_bins]
glew_bin_tocs = [Tree(p) for p in glew.dep_bins]
bin_tocs = sdl2_bin_tocs + glew_bin_tocs

# assets
kivy_assets_toc = Tree(kivy_data_dir, prefix=join('kivy_install', 'data'))
source_assets_toc = Tree('images', prefix='images')
assets_toc = [kivy_assets_toc, source_assets_toc]

tocs = bin_tocs + assets_toc

a = Analysis(['yourmain.py'],
             pathex=[os.getcwd()],
             binaries=None,
             datas=datas,
             hiddenimports=hiddenimports,
             hookspath=[],
             runtime_hooks=[],
             excludes=excludes_a,
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)


pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)


exe1 = EXE(pyz,
          a.scripts,
          name='mywindowsapplication',
          exclude_binaries=True,
          icon=join('images', 'mywinapp.ico'),
          debug=False,
          strip=False,
          upx=True,
          console=False)


coll = COLLECT(exe1,
               a.binaries,
               a.zipfiles,
               a.datas,
               *tocs,
               strip=False,
               upx=True,
               name='mywinapp')

将“myfile.spec”文件放在“yourmain.py”文件所在的同一目录中。然后从此目录运行 PyInstaller myfile.spec。将创建一个 build 和一个 dist 文件夹。在 dist 文件夹中,您可能会找到您的 exe。 希望这能让你继续前进。

【讨论】:

您的代码使用了外部模块?我这么说是因为我的主要问题是我不知道如何将 python 的外部模块(例如 icalendar)添加到 .spec 文件中。另外我不知道如何添加应用程序中使用的图像(kivy应用程序使用main.py目录的图像)。 是的,我正在使用很多外部模块。这将由脚本收集。您可以通过 datas 指令添加图像。在我的环境中,图像位于“common”子文件夹中。 添加资产目录时如何添加多个文件而不是文件夹?【参考方案2】:

Kivy 现在有一个在 Windows 中打包的指南:here,它适用于 kivy 1.9.1 或更高版本。还是类似于@Bill Bridge 的回答,如果需要,导入 sdl2、glew 和 gstreamer,

from kivy_deps import sdl2, glew

然后将这些参数添加到COLLECT

*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]

【讨论】:

【参考方案3】:

Kivy 文档是 here。

如果你想为那个平台创建一个包,你可能必须在 Windows 中运行它。

【讨论】:

以上是关于如何从我的 kivy 应用程序(Pyinstaller)获取 Windows 可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:滚动缩放

我如何使用 Kivy (Python) 相机

Mac 上 Eclipse IDE 中的 Python Kivy

Ubuntu中的Kivy安装错误[关闭]

PYTHON PIP和kivy安装教程

如何通过 Kivy 与我的计算机通信? [关闭]