【问题标题】:Import arbitrary subdirectory modules导入任意子目录模块
【发布时间】:2015-07-30 10:08:07
【问题描述】:

现状:

  • 我有一个脚本: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'>]

【问题讨论】:

  • 使用__import__
  • import x 不起作用,因为 import 不带变量。尝试__import__ 或使用importlib.import_module

标签: python import


【解决方案1】:

已识别问题:__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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多