小编典典

如何导入所有子模块?

python

我的目录结构如下:

| 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
?)导入它们的最干净方法。


阅读 164

收藏
2020-12-20

共1个答案

小编典典

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

__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(如果没有其他功能)则可以更干净地工作,即使它只是您导入的内容的列表也是如此。

2020-12-20