問題描述
我正在使用 PyInstaller (3.4) 打包一個 Kivy 應用程序,以便在 Windows 機器上使用.我已經讓它在我的機器上編譯和工作,但是當將 exe 移動到另一個時,它無法給出錯誤:
I'm packaging a Kivy app using PyInstaller (3.4) for use on Windows machines. I've gotten it to compile and work on my machine but when moving the exe to another, it fails giving the error:
[WARNING] [Image ] Unable to load image
C:Users<OTHER_MACHINES_USER>AppDataLocalTemp_MEI38442kivy_installdataglsldefault.png>
[CRITICAL] [Window ] Unable to find any valuable Window provider.
sdl2 - Exception: SDL2: Unable to load image
當整個東西被復制時(如在 ./dist/client_iface.exe
中),這在 dist
文件夾中起作用,所以我認為這是一個依賴問題我'一直無法解決,顯然是使用 SDL2.
This works from the dist
folder when the whole thing is copied across (as in ./dist/client_iface.exe
) and so I figure its a dependency issue I've been unable to resolve, apparently with SDL2.
我相信這個問題與 幾乎相同這個問題 但是這個問題已經存在兩年了,至今還沒有成功的解決方案.
I believe that this problem is almost identical to this problem however that question is two years old and as yet has no successful solution.
我遵循了許多指南(包括 這個 從上面的帖子鏈接)但沒有成功.
I've followed a number of guides (including this one which is linked from the above post) but with no success.
規范文件,根據 Kivy 指南進行了調整, 如下:
The spec file, with adjustments as per the Kivy guide, is as follows:
# -*- mode: python -*-
from kivy.deps import sdl2, glew
import os
block_cipher = None
a = Analysis(
['client_iface.py'],
pathex=['D:\Users\<USER>\Documents\2_Projects\py_dice_roller\client'],
binaries=[('D:\Users\<USER>\Documents\2_Projects\DnD\py_dice_roller\client\SDL2.dll', '.')],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False
)
a.datas += [
('client_iface.kv', '.\client_iface.kv', 'DATA'),
('active.png', '.\images\active.png', 'DATA'),
('back.png', '.\images\active.png', 'DATA'),
('normal.png', '.\images\active.png', 'DATA'),
('DroidSansMono.ttf', '.\fonts\DroidSansMono.ttf', 'DATA')
]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher
)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='client_iface',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True,
icon='.imagesicon_dWU_icon.ico',
)
coll = COLLECT(
exe, Tree(os.getcwd()),
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
name='client_iface'
)
按照上面的鏈接,我在腳本中包含了以下代碼:
And following the above linked I have included the following code in the script:
def resourcePath(path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS)
return os.path.join(os.path.abspath(path))
if __name__ == '__main__':
kivy.resources.resource_add_path(resourcePath('.'))
kivy.resources.resource_add_path(resourcePath('./images'))
main_app().run()
我使用的命令是:
python -m PyInstaller -F --onefile .client_iface.spec
預期結果是生成的單個可執行文件可以在任何類似機器上運行而不會出錯或不需要整個文件夾的附加文件.
The expected result would be that the single executable produced would run on any like-machine without error-ing or the need for the entire folder of additional files.
任何幫助將不勝感激.
推薦答案
.spec
文件的 COLLECT
部分表示 onedir
將創建可執行文件.為了使 onefile
可執行,您需要刪除 COLLECT
部分.此外,COLLECT
部分中列出的 sdl2 和 glew deps 可以作為 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
代替出現在第一個關鍵字參數之前的默認 [],
.
The COLLECT
section of your .spec
file indicates that a onedir
executable will be created. In order to make a onefile
executable, you will need to remove the COLLECT
section. Also, the sdl2 and glew deps that are listed in the COLLECT
section can be added to the EXE
section as *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
in place of the default [],
that appears before the first keyword argument.
另外,請注意,如果您使用的是 .spec
文件,則 Pyinstaller
的大多數命令行選項都會被忽略.有關詳細信息,請參閱 文檔.不幸的是,Pyinstaller
文檔在很多地方都相當模糊.
Also, note that most of the command line options of Pyinstaller
are ignored if you are using a .spec
file. Refer to the documentation for more details. Unfortunately, the Pyinstaller
documentation is rather vague in many places.
這篇關于PyInstalled Kivy 應用程序無法在第二臺機器上運行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!