如何在Python中递归导入子包?

时间:2018-11-21 22:25:05

标签: python import namespaces python-import

我的应用程序结构如下:

foo/
    bar/
        spam.py
    baz/
        eggs.py

我希望能够导入一个包(foo),并且还具有调用名称空间中所有可用子包(bar和baz)中的所有模块(垃圾邮件和鸡蛋)。

例如:

#!/usr/bin/python

import foo

foo.bar.spam.blah()
foo.baz.eggs.blah()

当前,我已经设计了以下__init__.py模板,该模板已放置在我的所有程序包目录中:

#!/usr/bin/python

from os.path import dirname, basename, isfile, isdir
import glob

__all__ = []

paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
    name = basename(p)
    if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
        __all__.append(name[:-3])
        __import__(name[:-3], globals(), locals(), [], -1)
    elif isdir(p):
        if isfile(p + '/__init__.py'):
            __all__.append(name)
            __import__(name, globals(), locals(), [], -1)

这似乎可行,但是我有点不知道它在做什么。我不了解Python的命名空间或导入系统。此代码安全吗?我使用一堆Google搜索将它们组合在一起。这里涉及哪些潜在的故障点?

打算此代码指示软件包导入软件包根目录内的所有模块和子软件包...我只是猜测,如果一个软件包直接从软件包名称空间中自动导入其模块, ,则可以使用调用空间中的 package module 访问这些模块。我认为这是因为模块被添加到包名称空间,然后又被添加到调用名称空间?基于这一点,我认为如果将其放入我的所有包和子包中,它最终应该提供对所有内容的访问,同时保留我已设置的层次结构?不确定代码是否精确地,完全地实现了我的目标,或者是否打开了我本不想打开的其他门。

有人可以告诉我吗

A。)此代码安全和/或结构合理吗?

B。)在Python中解决此问题的标准方法是什么?

0 个答案:

没有答案