关于kivy:Pyinstaller添加数据文件

Pyinstaller adding data files

我在pyinstaller上苦苦挣扎。每当我使用kivy GUI和.kv文件构建此特定脚本并在构建后运行.exe时,都会出现致命错误:

1
IOError: [Errno 2] No such file or directory: 'main.kv'

我尝试使用--add-data添加.kv文件以及mdb和dsn文件(用于pypyodbc),但出现错误:unrecognized arguments: --add-data'main.kv'。 (提到的其他文件还有更多的--add-data参数。)

此方法或替代方法是否有解决方案?


如果检查pyinstaller -h以获得帮助,则可以找到--add-data选项的工作方式,例如[--add-data <SRC;DEST or SRC:DEST>]。所以在你的情况下尝试

1
pyinstaller -F --add-data"main.kv;main.kv" yourtarget.py


正如其他人(@Anson Chan,@ schlimmchen)所说:

如果要添加一些其他文件,则应使用"添加数据文件"。

两种实施方式

  • 命令行:将参数添加到--add-data
  • 规格文件:将参数添加到datas=

    • 第一次运行pyinstaller时生成。

      • 然后,您可以编辑*.spec文件。
      • 然后运行pyinstaller将直接使用您的*.spec文件。

Parameter逻辑

--add-datadatas=中的参数:

  • --add-data

    • 格式:{source}{os_separator}{destination}

      • os_separator

        • Windows:;
        • Mac / Linux / Unix::
      • sourcedestination

        • 逻辑:

          • source:单个或多个文件的路径,支持glob语法。告诉PyInstaller在哪里找到文件。
          • destination
            一个或多个文件:目标文件夹,它将在运行时包含您的源文件。
            *注意:不是目标文件名。

            • folder:目标文件夹路径,与目标根目录相对,不是绝对路径。
    • 例子:

      • 单个文件:'src/README.txt:.'
      • 多个文件:'/mygame/sfx/*.mp3:sfx'
      • 文件夹:/mygame/data:data'
  • datas=

    • 格式:列表或元组。
    • 示例:请参见以下内容。
1
2
3
4
5
6
7
8
9
10
added_files = [
    ( 'src/README.txt', '.' ),
    ( '/mygame/data', 'data' ),
    ( '/mygame/sfx/*.mp3', 'sfx' )
]

a = Analysis(...
    datas = added_files,
    ...
)

你的情况

对于您的(Windows操作系统)为:

  • 命令行中的--add-data

    • pyinstaller -F --add-data"main.kv;." yourtarget.py

或:

  • yourtarget.spec文件中的datas=,请参见以下内容:
1
2
3
4
a = Analysis(...
    datas = ["main.kv","."],
    ...
)


解决方案是运行:pyi-makespec yourscript.py
然后编辑yourscript.spec脚本,并在a = Analysis中的数据下添加文件。

1
datas=[ ( '/pathToYourFile/main.kv', '.' )]

然后运行pyinstaller yourscript.spec
之后应该会很好。


我的应用程序遇到了这个问题,如果不是不可避免的话,可能还会发生随后的问题。

1. --kv文件的--add-data

使用--add-data作为crifan的答案。
2. Kivy仍然找不到文件

一旦PyInstaller将kv文件放在正确的目录中,Kivy仍然找不到该文件。

可能的症状:

  • GUI启动,但屏幕为黑屏且为空。
  • 取决于应用程序代码的AttributeError错误。

AttributeError示例:

  • 这个问题

  • 我自己的情况:

    AttributeError: 'NoneType' object has no attribute 'ids'

幸运的是,这个答案解决了这个问题。