如何导入所有子模块?

linkmaster03:

我的目录结构如下:

| 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

编辑:对不起,我有点含糊。我想在运行时导入子模块,而无需在中明确指定它们__init__.py我可以pkgutils.walk_packages用来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称(或walk_packages返回的ImpImporters ?)导入它们的最干净方法

乔·金顿:

编辑:这是一种在运行时递归导入所有内容的方法...

__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],那是这样做的一种方法。

可能有更好的方法,但是无论如何,这是我能做的最好的方法。

原始答案(对于上下文,请完全忽略。我最初对这个问题有误解):

scripts/__init__.py长什么样 应该是这样的:

import script1
import script2
import script3
__all__ = ['script1', 'script2', 'script3']

您甚至可以不定义进行操作__all__,但是即使您定义了内容,也可以使用pydoc(如果没有其他功能)则可以更干净地工作,即使它只是您导入的内容的列表也是如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章