无法在 windows 上使用 python kivy 创建 .exe (Pyinstaller)
Can't create a .exe with python kivy on windows (Pyinstaller)
所以,我正在尝试从 python kivy 代码制作 .exe,制作了 .exe,但无法打开。没有消息,什么都没有。我正在检查日志,但里面没有问题,所以我完全一头雾水。我正在使用以下 .spec
# -*- mode: python -*-
block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
spec_root = os.path.abspath(SPECPATH)
app_name = 'Gameficacao'
a = Analysis(['C:/Users/Artur/PycharmProjects/gameficacao/Gameficacao.py'],
pathex=[spec_root],
datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
hiddenimports=['win32timezone'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name=app_name,
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
console=False)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p)
for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
strip=False,
upx=False,
name=app_name)
如果你们有什么可以帮助我的(ANYTHING),请告诉我。
要将 .py 文件转换为 .exe,您可以使用 cx_freeze 模块。要安装它,请打开您的 cmd 并在安装后键入 pip install cx_freeze
创建一个新的 .py 文件并添加以下代码。
from cx_Freeze import setup, Executable
setup(name = "<anyname>",
version = "<any version>",
description = "<add description you want>",
executables = [Executable(r"<give the path where your python file is
located> ")]
)
将此文件另存为 setup.py 或您要保存的任何名称,并将此文件保存在同一文件夹中。
然后在该文件夹中打开“在此处打开命令 window”,您可以通过同时按住 Shift 键和右键单击来执行此操作。
然后在命令中输入 python setup.py(or the name you have given to new file) build
。
它将创建一个构建文件夹,在该文件夹中,您将找到您的 .exe 文件。
好的,我明白了。
首先,如果您遇到此问题,您必须首先将以下行添加到您的代码中:
def reset():
import kivy.core.window as window
from kivy.base import EventLoop
if not EventLoop.event_listeners:
from kivy.cache import Cache
window.Window = window.core_select_lib('window', window.window_impl, True)
Cache.print_usage()
for cat in Cache._categories:
Cache._objects[cat] = {}
if __name__ == '__main__':
reset()
'your app name here'().run()
这将防止应用程序无法打开(比如当它看起来正在加载但没有打开时)。
之后,您想使用这样的规范进行构建:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
a = Analysis(['C:\Users\Artur\PycharmProjects\gameficacao\Gameficacao.py'],
pathex=['C:\Users\Artur\Desktop\Trabalho\Gameficacao'],
binaries=[],
datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
hiddenimports=['pkg_resources.py2_warn','win32timezone','six','packaging','packaging.version','webbrowser','kivy','enchant'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='Gameficacao',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
strip=False,
upx=True,
upx_exclude=[],
name='Gameficacao')
现在,有些事情在这里非常重要,如果没有它,应用程序可能 运行,这些是:
- 行 "from kivy_deps import sdl2, glew, gstreamer",就在最上面
- 分析数据部分的填充,这里你必须指明你将在你的应用程序上使用的每个文件的路径,包括kivy文件。以我的为例。
- hiddenimports 行,在这里您将指出与您的应用程序相关且 PyInstaller 无法执行的每个导入。对于初学者,您可能想要放置 'pkg_resources.py2_warn',因为 PyInstaller 无法正确导入它,您将需要它。
- 行 "*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)]," 将是代码开头导入的补充。
这解决了我的问题。
如果和我一样的问题,指的是我们的旧openGL,我的是1.1,我无法升级,因为我的显卡也很旧。所以你不能把这一行放在你的主代码中:
from kivy_deps import angle
import os
os.environ['KIVY_GL_BACKEND'] ='angle_sdl2'
在此之后,您需要在 .spec 文件中导入:
from kivy_deps import angle,sdl2, glew
coll = COLLECT(exe, Tree('folder of your .kv
file'),
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in(angle.dep_bins +
sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
upx_exclude=[],
name='name')
创建exe。确保你有 UPX,如果没有,请下载并将其放在你运行 pyinstaller 的同一目录中。
所以,我正在尝试从 python kivy 代码制作 .exe,制作了 .exe,但无法打开。没有消息,什么都没有。我正在检查日志,但里面没有问题,所以我完全一头雾水。我正在使用以下 .spec
# -*- mode: python -*-
block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
spec_root = os.path.abspath(SPECPATH)
app_name = 'Gameficacao'
a = Analysis(['C:/Users/Artur/PycharmProjects/gameficacao/Gameficacao.py'],
pathex=[spec_root],
datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
hiddenimports=['win32timezone'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name=app_name,
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
console=False)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p)
for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
strip=False,
upx=False,
name=app_name)
如果你们有什么可以帮助我的(ANYTHING),请告诉我。
要将 .py 文件转换为 .exe,您可以使用 cx_freeze 模块。要安装它,请打开您的 cmd 并在安装后键入 pip install cx_freeze
创建一个新的 .py 文件并添加以下代码。
from cx_Freeze import setup, Executable
setup(name = "<anyname>",
version = "<any version>",
description = "<add description you want>",
executables = [Executable(r"<give the path where your python file is
located> ")]
)
将此文件另存为 setup.py 或您要保存的任何名称,并将此文件保存在同一文件夹中。
然后在该文件夹中打开“在此处打开命令 window”,您可以通过同时按住 Shift 键和右键单击来执行此操作。
然后在命令中输入 python setup.py(or the name you have given to new file) build
。
它将创建一个构建文件夹,在该文件夹中,您将找到您的 .exe 文件。
好的,我明白了。 首先,如果您遇到此问题,您必须首先将以下行添加到您的代码中:
def reset():
import kivy.core.window as window
from kivy.base import EventLoop
if not EventLoop.event_listeners:
from kivy.cache import Cache
window.Window = window.core_select_lib('window', window.window_impl, True)
Cache.print_usage()
for cat in Cache._categories:
Cache._objects[cat] = {}
if __name__ == '__main__':
reset()
'your app name here'().run()
这将防止应用程序无法打开(比如当它看起来正在加载但没有打开时)。 之后,您想使用这样的规范进行构建:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
from kivy_deps import sdl2, glew, gstreamer
a = Analysis(['C:\Users\Artur\PycharmProjects\gameficacao\Gameficacao.py'],
pathex=['C:\Users\Artur\Desktop\Trabalho\Gameficacao'],
binaries=[],
datas=[('C:/Users/Artur/PycharmProjects/gameficacao/*.kv', '.'), ('C:/Users/Artur/PycharmProjects/gameficacao/img/*.png', './img'),('C:/Users/Artur/PycharmProjects/gameficacao/font/*.ttf', './font'),('C:/Users/Artur/PycharmProjects/gameficacao/som/*.mp3', './som')],
hiddenimports=['pkg_resources.py2_warn','win32timezone','six','packaging','packaging.version','webbrowser','kivy','enchant'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='Gameficacao',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],
strip=False,
upx=True,
upx_exclude=[],
name='Gameficacao')
现在,有些事情在这里非常重要,如果没有它,应用程序可能 运行,这些是:
- 行 "from kivy_deps import sdl2, glew, gstreamer",就在最上面
- 分析数据部分的填充,这里你必须指明你将在你的应用程序上使用的每个文件的路径,包括kivy文件。以我的为例。
- hiddenimports 行,在这里您将指出与您的应用程序相关且 PyInstaller 无法执行的每个导入。对于初学者,您可能想要放置 'pkg_resources.py2_warn',因为 PyInstaller 无法正确导入它,您将需要它。
- 行 "*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)]," 将是代码开头导入的补充。
这解决了我的问题。
如果和我一样的问题,指的是我们的旧openGL,我的是1.1,我无法升级,因为我的显卡也很旧。所以你不能把这一行放在你的主代码中:
from kivy_deps import angle
import os
os.environ['KIVY_GL_BACKEND'] ='angle_sdl2'
在此之后,您需要在 .spec 文件中导入:
from kivy_deps import angle,sdl2, glew
coll = COLLECT(exe, Tree('folder of your .kv
file'),
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in(angle.dep_bins +
sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
upx_exclude=[],
name='name')
创建exe。确保你有 UPX,如果没有,请下载并将其放在你运行 pyinstaller 的同一目录中。