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

Python:如何从目录中的所有模块导入?

徐卓
2023-03-14
问题内容

目录结构:

main.py
my_modules/
   module1.py
   module2.py

module1.py:

class fooBar():
    ....
class pew_pew_FooBarr()
    ....
...

我如何才能将所有模块从模块添加到主类而没有前缀(即像foo = fooBar()一样使用它们,而不是foo =
my_modules.module1.fooBar())。

一个明显的决定是在main.py中编写如下内容:

from my_modules.module1 import *
from my_modules.module2 import *
from my_modules.module3 import *
...

但是我不想在创建新的moduleN时更改main.py。有解决方案吗?

我确实知道导入这样的类不是一个好主意,但是我对此仍然很好奇。

UPD:这个问题不同于在Python中将所有模块加载到文件夹中的问题,因为我的问题是加载不带名称空间的模块。


问题答案:

my_modules文件夹中,添加一个__init__.py文件以使其成为正确的程序包。在该文件中,您可以在文件的全局范围内注入每个模块的全局变量__init__.py,从而在导入模块时使它们可用(在将全局__all__变量的名称也添加到变量之后):

__all__ = []

import pkgutil
import inspect

for loader, name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(name).load_module(name)

    for name, value in inspect.getmembers(module):
        if name.startswith('__'):
            continue

        globals()[name] = value
        __all__.append(name)

现在,不要做:

from my_modules.class1 import Stuff

您可以这样做:

from my_modules import Stuff

或将所有内容导入全局范围,这似乎是您想要执行的操作:

from my_modules import *

这种方法的问题在于,类之间会相互覆盖,因此,如果提供了两个模块Foo,则只能使用最后一个导入的模块。



 类似资料:
  • 问题内容: 我有一个使用内置模块的Python脚本,但也导入了与主脚本本身位于同一目录中的许多自定义模块。 例如,我会打电话 和agent.py具有许多导入,包括: 其中checks与agent.py位于同一目录中的文件 当前工作目录为agent /时,一切都很好。但是,如果我从任何其他目录调用agent.py,则显然无法导入checks.py等错误。 我如何确保可以导入自定义模块,而不管从哪里调

  • 问题内容: 我的目录结构如下: 从导入模块。我尝试结合使用with ,但是使用该方法,我只能在using下直接导入所有子模块。我想让他们全都陷入困境。导入的所有子模块的最干净的方法是什么,以便可以从中访问? 编辑:对不起,我有点含糊。我想在运行时导入子模块,而不在中明确指定它们。我可以用来获取子模块名称(除非有人知道更好的方法),但是我不确定使用这些名称(或者返回的ImpImporters ?)导

  • 我有一个这样的文件结构: 在笔记本中的文件我想从和。 我已经找到了这个问题的答案,可以在每个笔记本中使用以下代码行,并每次将这些代码行作为第一个单元格运行: 有没有更好的办法?如果我有很多笔记本中的文件文件夹,我是否必须将这些代码行粘贴到每一行的开头?有更好、更简约或更干净的方法吗?

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

  • 我制作了我的python模块,它<code>A。py使用如下所示。在这种情况下,如何导入<code>B。py在?我想使用其他目录中的模块。但由于路径问题,我的代码无法工作。 A.py 碧桂园 main _ in _ mylib.py 主.py ModuleNotFoundError:没有名为“B”的模块 ModuleNotFoundError:没有名为“B”的模块

  • 问题内容: 我有一个要测试使用的应用程序,但是有一些问题。我的目录结构如下: 我想测试中的和模块,然后尝试做 但是在我不能导入我的目录包。 我该如何工作? 基本上,我想从测试的应用程序与和单独的目录。 我尝试将追加到,但是当我从导入时,我仍然从unittest得到一个。 编辑:我的导入和声明是: 和回溯: 问题答案: 要做的一件非常错误的事情是在上附加一个相对路径。如果要确定路径,请进行以下操作: