我的目录结构如下:
| main.py | scripts |--| __init__.py | script1.py | script2.py | script3.py
从导入main.py模块scripts。我尝试pkgutils.walk_packages结合使用with __all__,但是使用该方法,我只能在mainusing下直接导入所有子模块from scripts import *。我想让他们全都陷入困境scripts。导入的所有子模块的最干净的方法是什么,scripts以便可以scripts.script1从中访问main?
main.py
scripts
pkgutils.walk_packages
__all__
main
from scripts import *
scripts.script1
编辑:对不起,我有点含糊。我想在运行时导入子模块,而不在中明确指定它们__init__.py。我可以pkgutils.walk_packages用来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称(或者walk_packages返回的ImpImporters ?)导入它们的最干净方法。
__init__.py
walk_packages
编辑: 这是一种在运行时递归导入所有内容的方法…
(__init__.py顶级软件包目录中的内容)
import pkgutil __all__ = [] for loader, module_name, is_pkg in pkgutil.walk_packages(__path__): __all__.append(module_name) _module = loader.find_module(module_name).load_module(module_name) globals()[module_name] = _module
我不在__import__(__path__+'.'+module_name)这里使用,因为使用它正确地递归导入软件包很困难。但是,如果您没有嵌套的子软件包,并且想避免使用globals()[module_name],那是这样做的一种方法。
__import__(__path__+'.'+module_name)
globals()[module_name]
可能有更好的方法,但是无论如何,这是我能做的最好的方法。
原始答案 (对于上下文,请完全忽略。我最初误解了这个问题):
你scripts/__init__.py长什么样 应该是这样的:
scripts/__init__.py
import script1 import script2 import script3 __all__ = ['script1', 'script2', 'script3']
您甚至可以不定义进行操作__all__,但是即使您定义了内容,也可以使用pydoc(如果没有其他功能)则可以更干净地工作,即使它只是您导入的内容的列表也是如此。