2010-03-04 104 views
2

我想從一個模塊運行一組模塊(glob:invenio.webtag*),但我需要一種方法來導入所有這些模塊(並且只運行這些模塊)並運行doctest.testmod()。有任何想法嗎?Python模塊匹配模式

編輯:將溶液:使用__import__例如

import doctest 
import glob 
import os 
import pkgutil 
pkgpath = pkgutil.extend_path([], 'invenio')[0] 
for module_path in glob.glob(pkgpath + '/webtag*.py'): 
    module_name = os.path.splitext(os.path.basename(module_path))[0] 
    module = __import__('invenio.' + module_name) 
    doctest.testmod(module) 

回答

1

一個模塊可以被動態加載

my_module = __import__("mymodule") 

然後傳遞給testmod例如,

doctest.testmod(my_module) 

假設您可以使用glob.glob或過濾的結果從os.listdir建立匹配的模塊列表,你應該能夠使用這種方法。

更新:

導入invenio.webtag嘗試使用fromlist裏

module = __import__('invenio.webtag', globals(), locals(), ['invenio'], -1) 

看到this documentation的解釋。

+0

很酷,謝謝。現在我只需要弄清楚爲什麼這段代碼導入'invenio'而不是'invenio.webtag':'module = __import __('invenio.webtag')' – l0b0 2010-03-04 13:08:23

+0

@ l0b0:從'__import__'文檔:「導入時請注意,當fromlist爲空時,__import __('A.B',...)將返回程序包A,但fromlist中的子程序B不爲空時將返回程序包B. – 2010-03-04 13:19:48

+0

我已更新答案以顯示如何導入子模塊。 Pär在我進行編輯時發表了同樣的評論。 – mikej 2010-03-04 13:22:42