如何在Python包中读取导入模块的局部配置变量?
文末已更新解决方案
问题背景
我开发了一个可被多项目导入复用的dsutils包,其中封装了PDF读取器类。这个类会按层级调用pymupdf、pypdf2、form recognizer等不同PDF解析工具,让开发者可以基于封装类的通用功能开发项目,无需依赖特定解析包。
我希望每个项目都能通过自身的config.py模块覆盖解析工具的调用层级:当项目导入dsutils.pdf.reader时,优先读取本地config.py中的层级配置,没有的话再使用包内默认配置。但尝试了两种方法都没成功:
- 使用
globals():在项目的project_notebook.ipynb中执行test_variable = 42后,'test_variable' in globals()返回True;但在dsutils.pdf.reader.py的Reader类中定义check_globals方法返回globals(),在项目中调用该方法却无法检测到test_variable。 - 定义默认CONFIG字典:在
dsutils.pdf.reader.py里定义默认的CONFIG字典,Reader类的__init__方法将其作为默认参数;但在项目中修改dsutils.pdf.reader.CONFIG后,实例化Reader时仍会使用原始的默认值。
我的需求是:无需手动传参,包能自动优先读取项目本地的CONFIG(如果存在)。
解决方案
通过结合sys.argv和os.path检查项目目录下的config.py文件,使用importlib.util动态导入该配置模块,优先使用其中的pdf_parsing_hierarchy配置,不存在则使用包内默认配置。具体代码如下:
import os import sys import importlib.util project_directory = os.path.dirname(os.path.realpath(sys.argv[0])) project_name = project_directory.split('/')[-1] try: spec = importlib.util.spec_from_file_location("config", f"{project_directory}/config.py") config = importlib.util.module_from_spec(spec) sys.modules['config'] = config spec.loader.exec_module(config) if "pdf_parsing_hierarchy" not in config.CONFIG: print(f"{project_name}目录下的config.py文件缺少必需的'pdf_parsing_hierarchy'配置项。\n将使用默认解析层级(若未显式指定其他配置)。") from dsutils.pdf.config import CONFIG else: print(f"{project_name}项目已覆盖默认PDF解析层级。") CONFIG = config.CONFIG except: print(f"{project_name}目录下未检测到config.py文件。\n将使用默认PDF解析层级(若未显式指定其他配置)。") from dsutils.pdf.config import CONFIG
内容的提问来源于stack exchange,提问作者Evan Follis
相关产品推荐
相关产品推荐

