导入任意子目录模块
Import arbitrary subdirectory modules
现状:
我有一个脚本: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__()
的 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
中使用。
现状:
我有一个脚本:
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__()
的 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
中使用。