当前位置: 首页 > 面试题库 >

如何导入所有子模块?

蓟安歌
2023-03-14
问题内容

我的目录结构如下:

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



 类似资料:
  • 问题内容: 目录结构: module1.py: 我如何才能将所有模块从模块添加到主类而没有前缀(即像foo = fooBar()一样使用它们,而不是foo = my_modules.module1.fooBar())。 一个明显的决定是在main.py中编写如下内容: 但是我不想在创建新的moduleN时更改main.py。有解决方案吗? 我确实知道导入这样的类不是一个好主意,但是我对此仍然很好奇

  • 问题内容: 我是Python和一般编程的新手(最多几个星期)。 关于Python和使用模块,我意识到可以使用导入函数。 所以不用打字 我可以说 我发现这大大简化了工作。现在,说我想在模块之间使用一堆 变量 ,并将它们全部定义在一个python模块中。如何使用上述类似方法或同样简单的方法导入这些变量。我不想使用,然后要求在所有变量前面加上。 理想的情况是以下情况: py b.py 输出: 问题答案:

  • 问题内容: 我需要做类似的事情: 上面的代码无法编译;它抛出。 我尝试使用此处所示的方法,但是我不知道从哪里来。这是没有最终被接受的ES6提案吗?该文章中指向“编程API”的链接将我转至不推荐使用的docs页面。 问题答案: 现在,ECMA确实有动态进口建议。这是在第3阶段。这也可以作为babel-preset使用。 以下是根据您的情况进行条件渲染的方法。 这基本上返回了一个承诺。承诺解决方案有望

  • 我有一个使用git子模块的项目。在我的python文件中,我想在子模块项目中使用另一个python文件中的函数。 为了工作,我必须将init.py文件添加到路径中的所有子文件夹中。我的文件夹树如下: 有没有办法让它在不接触mygitsubmodule的情况下工作? 谢谢

  • 问题内容: 我已经看到了以下问题,但并不能完全让我知道我要去的地方:[如何获取Python当前模块中所有类的列表?](尝试这个:http://codingdict.com/questions/163282 import sys current_module = sys.modules[name] 在您的情况下: import sys, inspect def print_classes(): fo

  • 问题内容: 我想动态加载模块,给定它的字符串名(来自环境变量)。我正在使用Python 2.7。我知道我可以做类似的事情: 这大致相当于 (其中)。问题是,我需要相当于 因为我希望能够访问模块中的所有方法和变量。我试过了 但是这样做会导致很多错误。有没有一种方法可以在Python 2.7中动态导入模块的所有方法和属性? 问题答案: 如果您有模块对象,则可以模仿逻辑用法,如下所示: 但是,这几乎肯定