导入任意子目录模块

时间:2015-07-30 10:08:08

标签: python import

现状:

  • 我有一个脚本:program.py
  • 我有一个目录:/imports。其中包含子目录中的任意数量的模块。
  • 正在使用Python的包目录语法。

    __init__.py
    program.py
    /imports
        __init__.py
        /module a
            __init__.py
            other_files.py
        /module b
            __init__.py
            other
    

意向:

  • program.py应导入/imports
  • 中的每个子目录
  • program.py需要对象访问模块。例如,imports['name'].Service()

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

现有代码:

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'>]

1 个答案:

答案 0 :(得分:0)

发现问题:fromlist=[]的{​​{1}}参数丢失。请参阅Why does Python's __import__ require fromlist?进行详细说明。

更正示例:

__import__()

<强>输出:

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()