包内的imp.load_source

时间:2014-12-22 10:32:46

标签: python import

对于某些Python项目,我在config模块中定义了默认配置。通过使用

将rc文件导入其中,可以进行自定义
config = imp.load_source('config', 'some_rc_file')

rc文件可能只重新定义配置变量的一个子集,甚至根本不重新定义,我希望未重新定义的变量仍然作为config模块的属性及其默认值存在。如果从load_source调用__main__,则一切顺利。但是,如果在包中使用它,则模块中唯一的变量“left”是rc文件的变量。

有一个MWE heredirect.py按预期工作,但不是indirect.py

.
|-- run.sh                           # runs python {,in}direct.py
|-- altconfig.py                     # the rc file, redefines (only) BAR
|-- config.py -> testimp/config.py   # symlink to use by direct.py
|-- direct.py                        # calls load_source directly
|-- indirect.py                      # calls load_source via uses_config.py
`-- testimp
    |-- __init__.py
    |-- config.py                    # default config, defines FOO and BAR
    `-- uses_config.py

我错过了什么导入逻辑?

1 个答案:

答案 0 :(得分:2)

如果您在测试代码中添加print(config),则会看到import config导入的模块名为config,但from . import config导入的模块在testimp中称为testimp.configload_source的第一个参数是要重用的模块的名称。由于您正在寻找config,因此找不到您现有的导入,并且您获得了一个新的模块对象。

最简单的解决方案是不对代码模块的名称进行硬编码。将你的imp行更改为this,它将在任何地方都有效:

config = imp.load_source(config.__name__, 'altconfig.py')