You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:00:59