pyinstaller exe黑屏
Posted
技术标签:
【中文标题】pyinstaller exe黑屏【英文标题】:pyinstaller exe blank screen 【发布时间】:2016-05-17 23:51:47 【问题描述】:我使用 PyInstaller 在 Windows 10 上构建了一个 .exe。当我运行可执行文件时,会打开一个窗口,但它不显示任何小部件,只有一个空白屏幕。据我所知,输出没有显示任何错误。将 python 2.7 (Enthought Canopy) 与 Kivy 1.9.1 一起使用。当我运行原始源文件时,一切正常;只有 .exe 失败。
我的 .spec 文件如下所示:
# -*- mode: python -*-
from kivy.deps import sdl2, glew, gstreamer
block_cipher = None
a = Analysis(['C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p\\toolbox\\ui\\data_importer\\PhoenixKv.py'],
pathex=['C:\\Users\\Christiaan\\Documents\\Phoenix'],
binaries=None,
datas=[('C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p\\toolbox\\ui\\data_importer\\dev_ids.json', '.'), ('C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p\\toolbox\\ui\\data_importer\\ref_ids.json', '.')],
hiddenimports=['sqlalchemy.ext.hybrid'],
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)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='phoenix',
debug=True,
strip=False,
upx=False,
console=True )
coll = COLLECT(exe, Tree('C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p'),
a.binaries,
a.zipfiles,
a.datas + [('dev_ids.json', 'C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p\\toolbox\\ui\\data_importer\\', 'DATA'), ('ref_ids.json', 'C:\\Users\\Christiaan\\Documents\\lifeq_dp_pp_p\\toolbox\\ui\\data_importer\\', 'DATA')],
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=False,
name='phoenix')
我运行时的输出是:
PyInstaller Bootloader 3.x
LOADER: executable is C:\Users\Christiaan\Documents\Phoenix\dist\phoenix\phoenix.exe
LOADER: homepath is C:\Users\Christiaan\Documents\Phoenix\dist\phoenix
LOADER: _MEIPASS2 is NULL
LOADER: archivename is C:\Users\Christiaan\Documents\Phoenix\dist\phoenix\phoenix.exe
LOADER: No need to extract files to run; setting extractionpath to homepath
LOADER: SetDllDirectory(C:\Users\Christiaan\Documents\Phoenix\dist\phoenix)
LOADER: Already in the child - running user's code.
LOADER: Python library: C:\Users\Christiaan\Documents\Phoenix\dist\phoenix\python27.dll
LOADER: Loaded functions from Python library.
LOADER: Manipulating environment (sys.path, sys.prefix)
LOADER: sys.prefix is C:\Users\CHRIST~1\DOCUME~1\Phoenix\dist\phoenix
LOADER: Setting runtime options
LOADER: Initializing python
LOADER: Overriding Python's sys.path
LOADER: Post-init sys.path is C:\Users\Christiaan\Documents\Phoenix\dist\phoenix
LOADER: Setting sys.argv
LOADER: setting sys._MEIPASS
LOADER: importing modules from CArchive
LOADER: extracted struct
LOADER: callfunction returned...
LOADER: extracted pyimod01_os_path
LOADER: callfunction returned...
LOADER: extracted pyimod02_archive
LOADER: callfunction returned...
LOADER: extracted pyimod03_importers
LOADER: callfunction returned...
LOADER: Installing PYZ archive with Python modules.
LOADER: PYZ archive: out00-PYZ.pyz
LOADER: Running pyiboot01_bootstrap.py
LOADER: Running pyi_rth_win32comgenpy.py
LOADER: Running pyi_rth__tkinter.py
LOADER: Running pyi_rth_pkgres.py
LOADER: Running pyi_rth_kivy.py
LOADER: Running pyi_rth_mplconfig.py
LOADER: Running pyi_rth_mpldata.py
LOADER: Running pyi_rth_gstreamer.py
LOADER: Running pyi_rth_qt4plugins.py
Qt: Untested Windows version 10.0 detected!
LOADER: Running PhoenixKv.py
Purge log fired. Analysing...
Purge 5 log files
Purge finished!
[INFO ] [Logger ] Record log in C:\Users\Christiaan\.kivy\logs\kivy_16-02-08_23.txt
[INFO ] [Kivy ] v1.9.1
[INFO ] [Python ] v2.7.6 |CUSTOM| (default, Sep 15 2014, 17:36:35) [MSC v.1500 64 bit (AMD64)]
[INFO ] [Factory ] 179 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_gif, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO ] [OSC ] using <thread> for socket
[INFO ] [Window ] Provider: sdl2
[INFO ] [GL ] GLEW initialization succeeded
[INFO ] [GL ] OpenGL version <4.5.13397 Compatibility Profile Context 0>
[INFO ] [GL ] OpenGL vendor <ATI Technologies Inc.>
[INFO ] [GL ] OpenGL renderer <AMD Radeon HD 8870M>
[INFO ] [GL ] OpenGL parsed version: 4, 5
[INFO ] [GL ] Shading version <4.40>
[INFO ] [GL ] Texture max size <16384>
[INFO ] [GL ] Texture max units <32>
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Text ] Provider: sdl2
Successfully added file types.
Successfully added file types.
platform: Windows
[INFO ] [Base ] Start application main loop
【问题讨论】:
【参考方案1】:我遇到了同样的问题,通过将 .kv 文件复制到 dist 文件夹来解决它。
cp -R C:/Users/Ben/Documents/OpenCV_HummingbirdsMotion/MotionMeerkat/MotionMeerkat.kv dist/main/
这也可以通过将 .kv 作为数据对象添加到规范文件中来实现。基本上空白屏幕说,我知道有一个 kivy 应用程序,但我没有小部件。
【讨论】:
谢谢!这正是问题所在。 在构建应用程序时添加kv文件pyinstaller --clean -F --add-data="myapp.kv:." myApp.py
【参考方案2】:
我知道这是一篇旧帖子,但我想我会提供更多见解。
如果您尝试使用 --onefile 并且只创建一个文件,那么简单地将 .kv 文件移动到该目录对您来说不是一个好的选择。
我所做的是使用将 .kv 文件内容嵌入到 python 本身中
from kivy.lang import Builder
Builder.load_string("""
Your kivy content
""")
在我运行命令之前,将main.py
移动到它自己的文件夹中并将其重命名为main_em.py
之类的其他名称
python -m PyInstaller --onefile --windowed --name "myApp" "./main_em.py"
我将它移动到一个新文件夹的原因是,如果你尝试将程序作为一个 python 文件运行,它将堆叠两个相同的布局,所以基本上看起来你有双重视觉。
重命名并不是真正需要的,但我想保持我的代码库干净。
虽然,我对此不是 100% 确定,但我认为 PyInstaller 不知道如何处理 .kv 文件,因此您只需将其移动到文件夹中即可。但是,如果你将它嵌入到 python 中,那么它就在 python 代码中。
为了可维护性,将 .kv 文件嵌入到 Python 代码中并不是一个很好的做法,但在这种情况下,因为您正在打包它,所以这并不重要。
我处理工作流程的方式就是像其他方式一样处理您的 kviy 项目,并在您打包它的时候进行。您需要做的只是复制并粘贴到您的 main_em.py 中,然后在 main_em.py 上运行 PyInstaller。
这样您就可以遵守约定和最佳实践,也不必在打包后将 .kv 文件移动到目录中。两全其美。
我希望这对其他人有所帮助,这是我的第一篇文章。
【讨论】:
【参考方案3】:我正在查看一些文档,我认为您还可以执行以下操作:
Builder.load_file("./filename.kv")
这样您就不必按照我在其他帖子中的建议进行操作。 请记住,如果您从 python 运行它,则必须注释掉 Builder.load_file 行。
【讨论】:
以上是关于pyinstaller exe黑屏的主要内容,如果未能解决你的问题,请参考以下文章
pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行
使用pyinstaller将python文件打包成exe文件
详解python文件打包成exe(pyinstaller简介.安装.打包.常见问题)