【pyinstaller】打包.exe后添加额外的数据文件 | 自定义spec文件配置打包

报错

正常执行的python,打包之后会出现

FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\MYEARN~2\AppData\Local\Temp_MEI530482`docxcompose\templates\custom.xml`’

Traceback (most recent call last):
File "docxcompose\properties.py", line 103, in init
File "docx\opc\package.py", line 139, in part_related_by
File "docx\opc\rel.py", line 63, in part_with_reltype
File "docx\opc\rel.py", line 116, in _get_rel_of_type
KeyError: "no relationship of type 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties' in collection"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "SAP后处理718.py", line 1906, in 
File "SAP后处理718.py", line 1895, in combine_all_docx
File "docxcompose\composer.py", line 53, in append
File "docxcompose\composer.py", line 61, in insert
File "docxcompose\properties.py", line 105, in init
File "docxcompose\properties.py", line 111, in part_template
File "pkg_resources_init.py", line 1166, in resource_string
File "pkg_resources_init_.py", line 1412, in get_resource_string
File "pkg_resources_init_.py", line 1579, in _get
File "PyInstaller\loader\pyimod02_importers.py", line 197, in get_data
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\MYEARN~2\AppData\Local\Temp\_MEI530482\docxcompose\templates\custom.xml'

原因

PyInstaller 打包时没有正确地包含 docxcompose 包中的一些资源文件。

应该是一个常见错误。网络有相关案例和解决方案

在这个错误中,docxcompose 在运行时试图加载 custom.xml,这是一个它需要的模板文件,但是在打包的应用程序中找不到这个文件。

爬坑3:doccompose模板文件找不到

http://www.360doc.com/content/22/0701/07/18334519_1038164959.shtml

Pyinstaller 打包发布经验总结

https://blog.csdn.net/weixin_42052836/article/details/82315118

解决方法1:文件加进.exe中

PyInstaller 的命令,以便将特定路径的数据文件包含进你的 Python 程序打包成的单一可执行文件中

解决办法:

找到docxcompose\templates\custom.xml文件所在的位置,通过–add-data 参数添加到打包文件中。另外也可以使用spec文件,更强大,更灵活。可以参考传送门。

pyinstaller
-Fw --add-data C:\work\docxcompose\templates\*.*;docxcompose\templates\.
pyinstaller -Fw --add-data "C:\myproject\mydata\*.*;mydata\" myscript.py

参数解析

--add-data 选项被用来指定额外的数据文件或目录,格式是 SRC;DESTSRC:DEST,取决于操作系统。

在 PyInstaller 命令行参数中,-F-w 分别代表以下含义:

  • -F--onefile: 创建一个单一的可执行文件。如果没有这个选项,PyInstaller 会创建一个包含许多文件和目录的目录(包括一个主执行文件和许多依赖文件)。

  • -w--windowed : 用于指定程序是一个 GUI 应用,而不是命令行应用。这个选项会阻止 Python 在运行程序时打开一个控制台窗口。

因此,-Fw 实际上是两个选项的组合,指示 PyInstaller 创建一个单一的可执行文件,并且不应该打开一个控制台窗口。这对于 GUI 应用是常见的设置。

注意,你也可以把这两个选项分开写,比如 -F -w,效果是一样的。

C:\work\docxcompose\templates\*.*

docxcompose\templates\

对于本实例

pyinstaller -Fw --add-data "C:\Users\myearning\AppData\Roaming\Python\Python310\site-packages\docxcompose\templates\*.*;docxcompose\templates" SAP后处理718.py

注意,确保使用正确的路径分隔符和列表分隔符。在 Windows 上,路径分隔符是 \,列表分隔符是 ;

解决方法2:自定义spec文件配置

  1. 打开 .spec 文件:.spec文件(在这个例子中,它应该名为SAP后处理718.spec)包含了 PyInstaller 打包你的程序所需的所有信息。找到 a = Analysis(…)这一行,确保datas` 参数包含了你要添加的数据文件。它应该看起来像这样:

    a = Analysis(
        ['SAP后处理718.py'],
        pathex=[],
        binaries=[],
        datas=[('C:\\Users\\myearning\\AppData\\Roaming\\Python\\Python310\\site-packages\\docxcompose\\templates\\*.*', 'docxcompose\\templates')],
        hiddenimports=[],
        hookspath=[],
        hooksconfig={},
        runtime_hooks=[],
        excludes=[],
        win_no_prefer_redirects=False,
        win_private_assemblies=False,
        cipher=block_cipher,
        noarchive=False,
    )
    
  2. 重新打包:保存 .spec 文件,然后运行 pyinstaller SAP后处理718.spec 来重新打包你的程序。

  3. 运行 pyinstaller 命令并将 .spec 文件作为参数:

pyinstaller SAP后处理718.spec

你可能感兴趣的:(python)