对于某些Python项目,我在config
模块中定义了默认配置。通过使用
config = imp.load_source('config', 'some_rc_file')
rc文件可能只重新定义配置变量的一个子集,甚至根本不重新定义,我希望未重新定义的变量仍然作为config
模块的属性及其默认值存在。如果从load_source
调用__main__
,则一切顺利。但是,如果在包中使用它,则模块中唯一的变量“left”是rc文件的变量。
有一个MWE here。 direct.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
我错过了什么导入逻辑?
答案 0 :(得分:2)
如果您在测试代码中添加print(config)
,则会看到import config
导入的模块名为config
,但from . import config
导入的模块在testimp中称为testimp.config
。 load_source
的第一个参数是要重用的模块的名称。由于您正在寻找config
,因此找不到您现有的导入,并且您获得了一个新的模块对象。
最简单的解决方案是不对代码模块的名称进行硬编码。将你的imp行更改为this,它将在任何地方都有效:
config = imp.load_source(config.__name__, 'altconfig.py')