2014-02-24 35 views
1

我有一個腳本,執行以下操作:導入模塊小鬼

import imp 
imp.load_source("storage_configuration_reader","/bi/opt/RNAspace/rnaspace_sources/rnaspace/rnaspace/rnaspace/dao/storage_configuration_reader.py") 

後來,我調用類的這個模塊的名稱相同:

config = storage_configuration_reader() 

如果我進口它像上面我得到以下NameError NameError: global name 'storage_configuration_reader' is not defined但如果我使用下面的代碼:

import imp 
imp.load_source("storage_configuration_reader","/bi/opt/RNAspace/rnaspace_sources/rnaspace/rnaspace/rnaspace/dao/storage_configuration_reader.py") 
import storage_configuration_reader 
config = storage_configuration_reader() 

然後我得到的第被錯誤TypeError: 'module' object is not callable

改變imp.load_source的名稱不利於導入對象:

import imp 
imp.load_source("storage_configuration","/bi/opt/RNAspace/rnaspace_sources/rnaspace/rnaspace/rnaspace/dao/storage_configuration_reader.py") 
<module 'storage_configuration' from '/bi/opt/RNAspace/rnaspace_sources/rnaspace/rnaspace/rnaspace/dao/storage_configuration_reader.pyc'> 
import storage_configuration 
config = storage_configuration_reader() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'storage_configuration_reader' is not defined 

哪個是進口這樣一個對象的最佳方式(AKA工作方式)?

信息:該storage_configuration_reader定義:

​​
+0

模塊確實不可調用。你爲什麼要打電話?也許你希望在模塊中調用該類而不是? – Bach

+0

是的,這就是我想要的。 – Llopis

回答

3

imp.load_source負載使用給定path和使用新name命名的模塊,它不喜歡from your_module_at_path import your_class_by_name,它就像import your_module_at_path as new_name(不完全一樣)。

此外,你需要將名稱分配給一個變量來使用它:

wtf=imp.load_source("new_module_name", your_path) 
#wtf is the name you could use directly: 
config = wtf.storage_configuration_reader() 

名稱new_module_name存儲爲一個關鍵的字典sys.modules,你可以使用它像這樣:

sys.modules['new_module_name'].storage_configuration_reader() 

更簡單的方法從某個其他目錄導入模塊正在添加該模塊的路徑到sys.path

import sys 
sys.path.append("/bi/opt/RNAspace/rnaspace_sources/rnaspace/rnaspace/rnaspace/dao") 
import storage_configuration_reader 
config = storage_configuration_reader.storage_configuration_reader() 
+0

很好的答案,很好的解釋,雖然它解決了這個特殊的問題,它不會調試我的程序...無論如何,謝謝。 – Llopis

+1

@Llopis thx upvoting;) – zhangxaochen