PyCharm运行外部脚本报错:ModuleNotFoundError: No module named '_fontdata_enc_winansi'
问题解决:reportlab动态导入模块失败的问题
问题分析
核心问题出在reportlab.pdfbase._fontdata.py的动态导入逻辑:代码直接用短模块名(如_fontdata_enc_winansi)导入,未带上完整包路径或相对导入标识。虽然PyCharm的内容根目录配置让静态解析无报错,但运行时Python解释器无法在全局命名空间中定位到同包内的这些模块。
解决方案
1. 修复reportlab的动态导入代码
找到reportlab/pdfbase/_fontdata.py中使用importlib.import_module的动态导入部分,修改为以下两种方式之一:
相对导入方式(推荐,保持包结构独立性):
import importlib # module_name为动态生成的目标模块名,例如"_fontdata_enc_winansi" module = importlib.import_module(f".{module_name}", __name__)这里的
.表示相对当前包导入,__name__提供当前模块的包上下文,让解释器能定位到同目录下的模块。完整包路径方式:
import importlib module = importlib.import_module(f"reportlab.pdfbase.{module_name}")直接指定完整包路径,确保解释器能全局定位到目标模块。
2. 完善PyCharm的解释器路径配置
仅设置内容根目录可能不足以让运行时解释器正确识别路径,补充以下配置:
- 打开
File > Settings > Project: [你的项目名] > Python Interpreter - 点击右上角齿轮图标,选择
Show All - 选中当前使用的Python解释器,点击右侧的
Show paths for the selected interpreter - 点击
+号,分别添加z3c.rml和reportlab的src目录,点击OK保存配置
3. 验证配置有效性
运行脚本前,可在PyCharm的Python控制台执行以下代码确认路径:
import sys print([p for p in sys.path if "z3c.rml" in p or "reportlab" in p])
确保输出包含两个外部项目的src目录,同时确认_fontdata_enc_winansi.py文件确实存在于reportlab/pdfbase/目录下。
内容的提问来源于stack exchange,提问作者joeUser555
相关产品推荐
相关产品推荐

