2016-01-22 92 views
2

我有一個子模塊db.db_1稱爲prepared_db功能:導入它的名字的子模塊從一個模塊

from spam import db 

submodule_name = "db_1" 
func_name = "prepare_db" 
func = ... 

我怎麼可以得到由子模塊的名稱和功能名稱的功能在上面的背景?

UPDATE

爲了應對@histrio的回答,我可以證實他的代碼適用於os模塊。但在這種情況下它不起作用。要創建示例:

$ mkdir -p spam/db 
$ cat > spam/db/db_1.py 
def prepare_db(): 
    print('prepare_db func') 
$ touch spam/db/__init__.py 
$ PYTHONPATH=$PYTHONPATH:spam 

現在,你可以正常執行導入:

>>> from spam.db.db_1 import prepare_db 
>>> prepare_db() 
prepare_db func 

,但如果你這樣做動態的,我得到這個錯誤:

>>> getattr(getattr(db, submodule_name), func_name) 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-9-1b6aa1216551> in <module>() 
----> 1 getattr(getattr(db, submodule_name), func_name) 

AttributeError: module 'spam.db.db_1' has no attribute 'prepared_db' 

回答

1

我想我想通了,你需要將功能添加到__init__.py文件中的__all__變量,所以這將成爲以下內容的一部分:

from .db_1 import prepare_db 

__all__ = ['prepare_db'] 

之後,它應該工作得很好。

3

很簡單。您可以將模塊視爲對象。

import os 

submodule_name = "path" 
func_name = "exists" 

submodule = getattr(os, submodule_name) 
function = getattr(submodule, func_name) 
function('/home') # True 

或[只是爲了好玩,不這樣做]

fn = reduce(getattr, ('sub1', 'sub2', 'sub3', 'fn'), module) 

UPDATE

import importlib 
submodule = importlib.import_module('.'+submodule_name, module.__name__) 
function = getattr(submodule, func_name) 
+0

我曾嘗試過你的建議,但它並沒有真正起作用。請參閱最新的問題。 – RNA

+0

答覆已更新。確實你的情況有點複雜:) – histrio

+0

你有解釋爲什麼它在'os'模塊中工作,但不是我的情況? – RNA