問題描述
我有一個非常簡單的應(yīng)用程序(只是一個帶有標(biāo)簽的窗口),我正在嘗試引導(dǎo)自己完成轉(zhuǎn)換為單個可執(zhí)行文件的過程.這是程序目錄:
I've got a very simple App (just a window with a label) and I am trying to walk myself through the process of turning into a single executable. Here is the program directory:
brainfreeze/
main.py # simple app
main.kv # kv language style sheet
config/
settings.json # json settings panel data (F1 bound)
saving_to/
(empty at start)
我已成功使用 PyInstaller 將程序編譯為可執(zhí)行文件,但僅使用其 docs;我希望改用一個文件捆綁方法.到目前為止,當(dāng)我編譯時,應(yīng)用程序啟動但它是一個黑屏(傳統(tǒng)上我在 main.kv
無法加載時看到這個).我已閱讀 this, 這個,this 甚至 PyInstaller docs 但未能成功編譯為單個可執(zhí)行文件.這是 prog_test.spec:
I've successfully used PyInstaller to compile the program to an executable, but only using the one folder bundle method described in their docs; I'm looking to use the one file bundle method instead. So far, when I compile, the App launches but its a black screen (traditionally I have seen this when the main.kv
cannot be loaded). I've read this, this, this and even the PyInstaller docs but have had no luck in successfully compiling to a single executable. Here is the prog_test.spec:
# -*- mode: python -*-
from kivy.deps import sdl2
from kivy.deps import glew
block_cipher = None
a = Analysis(['..\brainfreeze\main.py'],
pathex=['H:\TestBed\single_exe_test'],
binaries=[],
data=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
a.datas += [('../brainfreeze/main.kv', 'DATA'), ('../brainfreeze/config/settings.json', 'DATA')]
exe = EXE(pyz, Tree('../brainfreeze/'),
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
name='prog_test',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True)
我很好奇是否是 a.datas
附加方法導(dǎo)致了問題,因為所有示例都有 3 個索引,而文檔只有 2 個索引.我的命令順序如下:
I'm curious if it is the a.datas
appending method causing problems, since all the examples have 3 indices while the documentation only has 2 indices. My command sequence is the following:
# from the 'saving to' directory
python -m PyInstaller --onefile --name prog_test ../brainfreeze/main.py
# alter the prog_test.spec to the above
python -m PyInstaller --onefile prog_test.spec
我在包含支持(.kv、.json
)文件方面做錯了什么?
What am I doing incorrectly to include the support (.kv, .json
) files?
推薦答案
我也遇到了這個問題,一個非常簡單的例子,也讀過你提到的相同文章.同樣,我的應(yīng)用程序在捆綁在一個文件夾中而不是在單個 exe 文件中時可以工作.我將 kivy 應(yīng)用程序類移動到一個單獨的 .py 文件中,所以主文件看起來像這樣:
I was also having this problem with a very simple example and had also read the same articles that you mentioned. Similarly, my app worked when bundled in a folder but not in a single exe file. I moved the kivy app class to a separate .py file so the main file looked something like this:
import os, sys
from kivy.resources import resource_add_path, resource_find
from myApp import AppClass
if __name__ == '__main__':
if hasattr(sys, '_MEIPASS'):
resource_add_path(os.path.join(sys._MEIPASS))
app = AppClass()
app.run()
myapp.kv 作為數(shù)據(jù)添加到規(guī)范文件中.這對我有用.我的懷疑是kivy資源路徑首先需要在python腳本中導(dǎo)入任何其他kivy包之前添加meipass目錄.
The myapp.kv was added in the spec file as data. And this worked for me. My suspicion is that the kivy resource path first needs to add the meipass directory before importing any other kivy packages in the python script.
這篇關(guān)于在使用 PyInstaller --onefile 打包 kivy 時包含 .kv/.json 文件?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!