在Pyinstaller exe中找不到主KV文件。

问题描述 投票:0回答:1

我在这里束手无策...... 我有一个kivy应用程序,它在解释器中运行得很好,作为一个目录构建时也很好。 但似乎不管我如何构建它,生成的exe总是找不到我的main.kv文件。 我的文件结构是,我基本上有图片和一堆屏幕。

main.py
main.kv
resources/image 1
         /image 2
         /kv_files/screen1
                  /screen2 

我在SO上看过所有类似的问题,包括 这个这个这个. 我想我已经尝试了所有的选项,最近我加入了

def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
    # PyInstaller creates a temp folder and stores path in _MEIPASS
    base_path = sys._MEIPASS
except Exception:
    base_path = os.environ.get("_MEIPASS2",os.path.abspath("."))

return os.path.join(base_path, relative_path)

到我的脚本顶部,然后

 resource_path('main.kv')

就在'app.run()'之前。 在这一点上,我觉得我已经尝试了不同建议中的所有其他组合。 规范文件是

# -*- mode: python ; coding: utf-8 -*-
 from kivy_deps import sdl2, glew

block_cipher = None

a = Analysis(['C:\\Users\\nicks\\PycharmProjects\\Winapp\\main.py'],
         pathex=['C:\\Users\\nicks\\Desktop\\Winapp'],
         binaries=[],
         datas=[('C:\\Users\\nicks\\PycharmProjects\\Winapp\\main.kv', '.')],
         hiddenimports=['pkg_resources.py2_warn', 'win32timezone'],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher,
         noarchive=False)

pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
a.datas += [('main.kv', 'C:/users/nicks/PyCharmProjects/Winapp/main.kv', 'DATA')]

exe = EXE(pyz, Tree('C:\\Users\\nicks\\PycharmProjects\\Winapp\\resources', 'DATA'),
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
      name='mainapp',
      debug=True,
      bootloader_ignore_signals=False,
      strip=False,
      upx=True,
      upx_exclude=[],
      runtime_tmpdir=None,
      console=True)

似乎无论我怎么尝试,命令行都会给我提供

Traceback (most recent call last):
File "main.py", line 147, in <module>
File "lib\site-packages\kivy\lang\builder.py", line 288, in load_file
FileNotFoundError: [Errno 2] No such file or directory: 'main.kv'

如果有用的话,第147行是...。

GUI = Builder.load_file('main.kv')

所以我明白为什么找不到它是个问题。 我看了PyInstaller的文档,关于a.datas和Tree应该如何结构,所以我认为它们是确定的,但我仍然觉得有一些基本的东西我没有得到。 任何帮助都是感激不尽的......。

python-3.x kivy pyinstaller kivy-language
1个回答
1
投票

我是这样做的。在我的 main.spec 文件,我指定我的 kv 这样的文件。

         datas=[('gamescreen.kv', '.')]

因为它和我的 main.py,不需要完整的路径。

要添加 sys._MEIPASS 到资源路径,我使用(在顶部的 main.py):

if getattr(sys, 'frozen', False):
    # this is a Pyinstaller bundle
    kivy.resources.resource_add_path(sys._MEIPASS)

另外,只是提醒一下 pyinstaller 有一些关于命令行参数的奇怪行为。请注意 文件 探讨了实际产生影响的有限选择。pyinstaller 是用 .spec 文件作为参数。在这种情况下,一些命令行选项会被默默忽略。

© www.soinside.com 2019 - 2024. All rights reserved.