报错
正常执行的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 <module>
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;DEST
或 SRC: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文件配置
-
打开
.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, )
-
重新打包:保存
.spec
文件,然后运行pyinstaller SAP后处理718.spec
来重新打包你的程序。 -
运行
pyinstaller
命令并将.spec
文件作为参数:
pyinstaller SAP后处理718.spec