使用PyInstaller打包Python多库程序时遇xml.parsers.expat缺失错误求助
解决PyInstaller打包时
xml.parsers.expat模块找不到的问题 问题描述
我是Python新手,开发了一款自用应用,依赖PyQt5、sqlite3、openpyxl等第三方库。使用PyInstaller将其打包为.exe文件时,出现No module named 'xml.parsers'错误,尝试多种引入方式均未解决,恳请提供解决思路。
可复现代码
from decimal import Decimal import openpyxl # xl libraries wb = openpyxl.load_workbook(r'C:\Users\jmstr\OneDrive\Documents\finproxlc.xlsx') myint = Decimal("27") print("hello")
使用的PyInstaller命令
pyinstaller C:\Users\usr1\IdeaProjects\GUIProjects\finpro.py -p C:\Users\usr1\venv\Lib\site-packages\openpyxl --hidden-import openpyxl --additional-hooks-dir C:\Users\usr1\venv\Lib\site-packages\openpyxl --collect-all xml.parsers.expat
完整报错信息
['C:\Users\usr1\IdeaProjects\GUIProjects', 'C:\Users\usr1\venv\Lib\site-packages\openpyxl'] Traceback (most recent call last): File "c:\users\usr1\appdata\local\programs\python\python39\lib\runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "c:\users\usr1\appdata\local\programs\python\python39\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "C:\Users\usr1\AppData\Local\Programs\Python\Python39\Scripts\pyinstaller.exe__main__.py", line 7, in <module> File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller__main__.py", line 194, in console_script_run run() File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller__main__.py", line 180, in run run_build(pyi_config, spec_file, **vars(args)) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller__main__.py", line 61, in run_build PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\building\build_main.py", line 977, in main build(specfile, distpath, workpath, clean_build) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\building\build_main.py", line 899, in build exec(code, spec_namespace) File "C:\Users\usr1\finpro.spec", line 14, in <module> a = Analysis( File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\building\build_main.py", line 379, in __init__ self.hookspath += discover_hook_directories() File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\isolated_parent.py", line 404, in wrapped return call(function, *args, **kwargs) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\isolated_parent.py", line 373, in call return isolated.call(function, *args, **kwargs) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\isolated_parent.py", line 311, in call raise RuntimeError(f"Child process call to {function.__name__}() failed with:\n" + output) RuntimeError: Child process call to discover_hook_directories() failed with: File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\isolated_child.py", line 63, in run_next_command output = function(*args, **kwargs) File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\building\build_main.py", line 107, in discover_hook_directories import pkg_resources File "c:\users\usr1\appdata\local\programs\python\python39\lib\site-packages\pkg_resources\__init__.py", line 35, in <module> import plistlib File "c:\users\usr1\appdata\local\programs\python\python39\lib\plistlib.py", line 61, in <module> from xml.parsers.expat import ParserCreate ModuleNotFoundError: No module named 'xml.parsers'
解决思路
- 验证Python标准库完整性:
xml.parsers.expat是Python标准库的一部分,先在命令行执行python -c "from xml.parsers.expat import ParserCreate; print('正常')",确认本地Python3.9环境中该模块能正常导入。如果执行失败,说明Python环境损坏,需要重新安装Python。 - 修正PyInstaller命令参数:
- 移除
--additional-hooks-dir参数:你指定的openpyxl目录不是PyInstaller的hook目录,这个参数会干扰hook发现逻辑,导致pkg_resources导入出错。 - 调整模块收集参数:将
--collect-all xml.parsers.expat改为--hidden-import xml.parsers.expat,或者直接收集整个xml.parsers包:--collect-all xml.parsers。 - 简化后的命令:
pyinstaller C:\Users\usr1\IdeaProjects\GUIProjects\finpro.py --hidden-import openpyxl --hidden-import xml.parsers.expat
- 移除
- 直接修改spec文件:如果已经生成了
finpro.spec文件,打开文件找到Analysis部分,在hiddenimports列表中添加'xml.parsers.expat',例如:
然后执行a = Analysis( ['C:\\Users\\usr1\\IdeaProjects\\GUIProjects\\finpro.py'], pathex=[], binaries=[], datas=[], hiddenimports=['openpyxl', 'xml.parsers.expat'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False, )pyinstaller finpro.spec重新打包。 - 重建虚拟环境:如果以上方法都无效,考虑创建一个全新的虚拟环境,重新安装所有依赖库后再尝试打包,避免环境中存在损坏的依赖文件。
内容的提问来源于stack exchange,提问作者joel
相关产品推荐
相关产品推荐

