Pyinstaller 添加数据文件

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

我正在与 pyinstaller 作斗争。每当我使用 kivy GUI 和 .kv 文件构建这个特定脚本,并在构建后运行 .exe 时,我都会收到致命错误:

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

我尝试使用 --add-data 添加 .kv 文件以及 mdb 和 dsn 文件(用于 pypyodbc),但出现错误:

unrecognized arguments: --add-data'main.kv'
。 (提到的其他文件还有更多 --add-data 参数。)

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

kivy pyinstaller kivy-language
5个回答
103
投票

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

如果您想添加一些额外的文件,您应该使用添加数据文件

两种实现方式

  • 命令行:将参数添加到
    --add-data
  • 规格文件:将参数添加到
    datas=
    • 第一次运行
      pyinstaller
      时生成。
      • 然后您可以编辑您的
        *.spec
        文件。
      • 然后运行
        pyinstaller
        将直接使用您的
        *.spec
        文件。

Parameter
逻辑

--add-data
datas=
中的参数:

  • --add-data
    • 格式:
      {source}{os_separator}{destination}
      • os_separator
        :(使用
        os.pathsep
        • Windows:
          ;
        • Mac/Linux/Unix:
          :
      • source
        destination
        • 逻辑:
          • source
            :单个或多个文件的路径,支持glob语法。告诉 PyInstaller 在哪里可以找到文件。
          • destination
            一个或多个文件:目标文件夹,将在运行时包含源文件。 * 注意不是目标文件名。
            • folder:目标文件夹路径,与目标根目录相对不是绝对路径。
    • 示例:
      • 单个文件:
        'src/README.txt:.'
      • 多个文件:
        '/mygame/sfx/*.mp3:sfx'
      • 文件夹:
        '/mygame/data:data'
  • datas=
    • 格式:列表或元组。
    • 示例:请参阅以下内容。
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

或:

  • datas=
    yourtarget.spec
    文件中,请参阅以下内容:
a = Analysis(...
    datas = ["main.kv", "."],
    ...
)

62
投票

如果您检查

pyinstaller -h
寻求帮助,您会发现
--add-data
选项的工作方式如下
[--add-data <SRC;DEST or SRC:DEST>]
。所以在你的情况下尝试

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

9
投票

解决方案是运行:

pyi-makespec yourscript.py
然后编辑 yourscript.spec 脚本并在 a= Analysis 中的 datas 下添加文件。

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

然后运行

pyinstaller yourscript.spec
之后应该就好了。


3
投票

运行 pyinstaller 时假定使用 Next -F 或 --onefile 选项。

  1. 请注意(此处为 MacOS Monterey,12.2).app 文件中的预期文件夹层次结构将与此类似,

expected_folder_hierarchy

pyinstaller 不会添加文件,也不会在该文件夹结构的任何文件夹中创建必要的文件夹;至少不是以任何明显的方式。你不会找到他们的。

  1. 但是,当应用程序运行时,/var/folders 下会使用一个临时文件夹,这与上面第 1 点中的文件夹结构有很大不同。运行应用程序时,
    print(os.path.dirname(__file__))
    将显示每次运行时使用的确切临时文件夹。为了方便起见,我们将其称为
    my_app_tmp_folder
    ,即您的应用程序在文件夹
    /var/folder/my_app_tmp_folder
  2. 下运行

然后,pyinstaller 在此临时文件夹中添加数据文件或创建必要的目录。换句话说,当应用程序运行时,所有添加的文件都将在那里并根据指定的文件夹结构(通过

--add-data
选项)。
print(os.listdir(os.path.dirname(__file__)))
将显示系统和应用程序所需的文件和文件夹。

底线:使用

--add-data
选项指定的文件在运行时将在
/var/folder/my_app_tmp_folder
中可见,而不是在 *.app 文件夹中可见。

文档中的一些有用链接:

https://pyinstaller.readthedocs.io/en/stable/runtime-information.html#using-file

https://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-files-to-the-bundle

https://pyinstaller.readthedocs.io/en/stable/operating-mode.html#bundling-to-one-file


-1
投票

我的应用程序存在此问题,并且如果不是不可避免的话,“很可能”也会出现后续问题。 1. --为 kv 文件添加数据

使用

--add-data

,如 crifan 的答案。

2. Kivy 还是找不到文件

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

可能的症状

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

  • 这个问题

  • 我自己的案例:
  • AttributeError: 'NoneType' object has no attribute 'ids'

    
    

  • 幸运的是,
这个答案

解决了问题。

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