我的应用程序结构如下:
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中解决此问题的标准方法是什么?