2010-03-04 107 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