在使用PyInstaller --onefile包装kivy时包含.kv/.json文件吗? [英] Include .kv/.json files while packaing kivy with PyInstaller --onefile?

查看:65
本文介绍了在使用PyInstaller --onefile包装kivy时包含.kv/.json文件吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个非常简单的应用程序(只是一个带有标签的窗口),我正尝试逐步完成将其转换为单个可执行文件的过程.这是程序目录:

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将程序编译为可执行文件,但仅使用了,甚至是PyInstaller

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附加方法,因为所有示例都具有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?

推荐答案

我也通过一个非常简单的示例遇到了这个问题,并且还阅读了您提到的相同文章.同样,捆绑在文件夹中但不在单个exe文件中时,我的应用程序可以正常工作. 我将kivy应用程序类移到了一个单独的.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已作为数据添加到规范文件中.这对我有用. 我的怀疑是,在导入python脚本中的任何其他kivy软件包之前,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.

这篇关于在使用PyInstaller --onefile包装kivy时包含.kv/.json文件吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆