【发布时间】:2011-01-01 09:31:42
【问题描述】:
给定以下示例布局:
test/
test.py
formats/
__init__.py
format_a.py
format_b.py
我尝试归档的是,每当我 import formats 时,__init__.py 在 formats 子目录中查找所有可用模块,加载它们并使它们可用(现在只需通过变量 supported_formats )。如果有更好、更 Python 或其他方式在运行时根据物理可用文件动态加载内容,请告知。
我的方法
我尝试过这样的事情(__init__.py):
supported_formats = [__import__(f[:f.index('.py')]) for f in glob.glob('*.py')]
到目前为止,当我从命令行(从格式子目录或从其他目录)运行 __init__.py 时,我只是让它工作。但是当我从test.py 导入它时,它会像这样让我失望:
ImportError: No module named format_a.py
当我从 python 解释器导入它时,当我在除 formats 子目录之外的其他目录中启动解释器时也是如此。
这是整个代码。它还查找一个特定的类并将每个类的一个实例存储在一个字典中,但动态加载模块是我没有得到的主要部分:
def dload(get_cls=True, get_mod=True, key=None, fstring_mod='*.py', fstring_class=''):
if p.dirname(__file__):
path = p.split(p.abspath(__file__))[0]
fstring_mod = p.join(path, fstring_mod)
print >> sys.stderr, 'Path-Glob:', fstring_mod
modules = [p.split(fn)[1][:fn.index('.py')] for fn in glob.glob(fstring_mod)]
print >> sys.stderr, 'Modules:', ', '.join(modules)
modules = [__import__(m) for m in modules]
if get_cls:
classes = {} if key else []
for m in modules:
print >> sys.stderr, "-", m
for c in [m.__dict__[c]() for c in m.__dict__ if c.startswith(fstring_class)]:
print >> sys.stderr, " ", c
if key:
classes[getattr(c, key)] = c
else:
classes.append(c)
if get_mod:
return (modules, classes)
else:
return classes
elif get_mod:
return modules
_supported_formats = dload(get_mod=False, key='fid', fstring_mod='format_*.py', fstring_class='Format')
我的想法
文件系统路径之类的东西可能很混乱。我想用模块命名空间或类似的东西来处理这个问题,但我现在有点迷失如何开始和如何寻址模块,所以它们可以从任何地方访问。
【问题讨论】:
标签: python dynamic import packaging