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简介.安装.打包.常见问题)

Python执行pyinstaller打包生成的exe文件实战

Pyinstaller - 独立的 .exe

使用pyinstaller将Python打包为exe文件