【问题标题】:Pyinstaller adding data filesPyinstaller 添加数据文件
【发布时间】:2017-06-11 18:18:36
【问题描述】:

我正在努力使用 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


    【解决方案1】:

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

    如果你想添加一些额外的文件,你应该使用Adding Data Files

    两种实现方式

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

    Parameter逻辑

    --add-datadatas= 中的参数:

    • --add-data:
      • 格式:{source}{os_separator}{destination}
        • os_separator:
          • 窗口:;
          • Mac/Linux/Unix::
        • sourcedestination
          • 逻辑:
            • source:单个或多个文件的路径,支持glob 语法。告诉 PyInstaller 在哪里可以找到文件。
            • destination 文件或文件:在运行时将包含源文件的目标文件夹。 * NOTENOTE 目标文件名。
              • 文件夹:目标文件夹路径,与目标根目录相对不是绝对路径。
      • 示例:
        • 单个文件:'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", "."],
        ...
    )
    

    【讨论】:

    • 这是一个很好的答案,非常清楚地显示了命令行参数和规范文件等效项之间的等效性。这些例子很棒。干得好
    • 如果它可以帮助其他人,在我的情况下,我有一个 chromedriver.exe 存储在资源文件夹中。因此,我的命令 --add-data 行是:--add-data 'src\resources\chromedriver.exe;resources.' 然后将资源文件夹添加到临时 MEIPASS 文件夹中,模仿我的实际目录。
    【解决方案2】:

    如果您查看pyinstaller -h 寻求帮助,您会发现--add-data 选项的作用类似于[--add-data <SRC;DEST or SRC:DEST>]。所以在你的情况下尝试

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

    【讨论】:

    • 使用分号还是冒号作为分隔符取决于os.pathsep,即在大多数*nix系统上这是一个冒号,而在Windows上这应该是一个分号。
    • 关于输出 dist/ 文件夹,main.kv 到哪里去了?
    • man pyinstaller docs 可以更清楚地说明...我发现的所有示例都使用了: ...通常我只是在规范文件中执行此操作,但我真的不想要一个规范文件项目
    • 上面将在分发路径中添加一个文件夹,其中包含 main.kv,如下所示:distfolder/main/main.kv。要解决此问题,命令应为:pyinstaller -F --add-data "main.kv;." yourtarget.py
    • @Spencer 的评论在我看来是这个答案的重要组成部分,目前形式的答案有点误导
    【解决方案3】:

    解决办法是运行:pyi-makespec yourscript.py 然后编辑 yourscript.spec 脚本并将文件添加到 a= Analysis 中的 datas 下。

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

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

    【讨论】:

    • @HarshitAgrawal 然后添加逗号:datas=[ ( '/pathToYourFile/main.kv', '.' )],
    • @pmus 我也尝试过使用逗号,但是当我运行 .exe 文件“太多的值无法解压”错误时,没有工作并显示相同的错误。
    • 对于未来的用户,如果您得到“太多值无法解包”,请确保将您的路径作为 ('source\dir', 'destination\dir') 形式的元组添加到列表中。我最初在阅读答案时错过了这个并得到了太多的值错误。
    • 在将我自己的图像文件添加到包后,我遇到了与@BrandonBarney 相反的情况——解包的值太少。从我自动生成的.spec 文件中查看a.datas 的内容后,我发现每个元组都有一个额外的字符串'DATA'... 所以我不得不使用:a.datas += [('assets/icon.ico', 'assets/icon.ico', 'DATA')] 这似乎不是-文档中的最新内容。
    • 在 spec 文件中,可以添加什么相当于命令行中的 --onefile 选项?
    【解决方案4】:

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

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

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

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

    然后,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

    【讨论】:

      【解决方案5】:

      我的应用程序遇到了这个问题,并且后续的问题很可能,如果不是不可避免的话。

      1。 --add-data 用于 kv 文件

      使用--add-data,就像crifan 的回答一样。

      2。 Kivy 还是找不到文件

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

      可能的症状

      • GUI 启动,但屏幕为black and empty
      • 取决于应用程序代码的 AttributeError 错误。

      AttributeError 示例:

      • This question

      • 我自己的情况:

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

      幸运的是,this answer 解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 2022-10-17
        • 2020-09-12
        • 2020-07-31
        相关资源
        最近更新 更多