导入任意子目录模块

Import arbitrary subdirectory modules

现状:

意图:

备注:我不想说明我的目的或质疑设计选择。我正在使用上述解决方法。 问题描述如下。

现有代码:

import os

modules = []
IMPORT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'imports')
to_import = [name for name in os.listdir(IMPORT_PATH) if os.path.isdir(os.path.join(IMPORT_PATH, name))]
modules = [__import__('imports.' + x) for x in to_import]
print modules

输出:

[<module 'imports' from '/code/test/imports/__init__.pyc'>, <module 'imports' from '/code/test/imports/__init__.pyc'>]

期望输出:

[<module 'B' from '/code/test/imports/B'>, <module 'C' from '/code/test/imports/C'>]

已识别问题:缺少 __import__()fromlist=[] 参数。详见 Why does Python's __import__ require fromlist?

更正示例:

modules = {}
IMPORT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'imports')
to_import = [name for name in os.listdir(IMPORT_PATH) if os.path.isdir(os.path.join(IMPORT_PATH, name))]
for x in to_import:
    modules[x] = __import__('imports.' + x, fromlist=['*'])

输出:

{'C': <module 'imports.C' from '/code/test/imports/C/__init__.pyc'>, 
'B': <module 'imports.B' from '/code/test/imports/B/__init__.pyc'>}

取得的成果:

  • 现在 modules[dir_name].Service() 可以在 program.py 中使用。