2010-03-04 5 views
2

Я хотел бы запустить doctest s для набора модулей (glob: invenio.webtag*) из одного модуля, но мне понадобится способ импортировать все эти (и только эти) модули и запустить doctest.testmod() на всех из них. Есть идеи?Модули Python, соответствующие шаблону

Редактировать: Решение:

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

Модуль может быть динамически загружены с помощью __import__ например

my_module = __import__("mymodule") 

, а затем передано testmod, т.е.

doctest.testmod(my_module) 

Предполагая, что вы можете создать список согласующих модулей с использованием либо glob.glob или фильтрации результатов от os.listdir вы должны быть в состоянии использовать этот подход.

Update:

Чтобы импортировать invenio.webtag попробовать использовать fromlist:

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

см this documentation для объяснения.

+0

Прохладный, спасибо. Теперь мне просто нужно выяснить, почему этот кусок кода импортирует 'invenio' вместо' invenio.webtag': 'module = __import __ ('invenio.webtag')' – l0b0

+0

@ l0b0: Из документов '__import__':« При импорте модуль из пакета, обратите внимание, что __import __ ('A.B', ...) возвращает пакет A, когда fromlist пуст, но его подмодуль B, когда fromlist не пуст. " –

+0

Я обновил ответ, чтобы показать, как импортировать подмодуль. Pär добавил комментарий, говорящий то же самое, пока я делал редактирование. – mikej

Смежные вопросы