2014-12-22 43 views
1

對於某些Python項目,我在config模塊中定義了默認配置。定製是通過獲取使用來自包內的imp.load_source

config = imp.load_source('config', 'some_rc_file') 

RC文件可能會重新定義只配置變量的一個子集,甚至根本不是一個RC文件到它允許的,我希望這不是重新定義的變量仍然存在如config模塊的屬性及其默認值。如果從__main__調用load_source,則一切順利。但是,如果它在一個包中使用,模塊中唯一的變量'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 

什麼進口的邏輯我缺少什麼?

回答

2

如果添加print(config)到你的測試代碼,你會看到,import config導入的模塊被命名爲config,但from . import config在testimp進口模塊稱爲testimp.configload_source的第一個參數是要重用的模塊的名稱。由於您正在查找config,因此找不到您的現有導入,並且您將獲得一個新的模塊對象。

最簡單的解決方案是不要硬編碼模塊的名稱。改變你的imp線條,並且它會在任何地方工作:

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