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

标签 python import module

目录结构:

main.py
my_modules/
   module1.py
   module2.py

模块1.py:

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

我如何在没有前缀的情况下将 module* 中的所有类添加到 main 中(即像 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:这个问题与这个问题不同Loading all modules in a folder in Python ,因为我的问题是加载没有命名空间的模块。

最佳答案

my_modules 文件夹中,添加一个 __init__.py 文件,使其成为一个合适的包。在该文件中,您可以在 __init__.py 文件的全局范围内注入(inject)每个模块的全局变量,这使得它们在您的模块被导入时可用(在您还添加了名称之后全局到 __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:如何从目录中的所有模块导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16852811/

相关文章:

python - 如何使用静态方法作为策略设计模式的默认参数?

Python OpenCV 不会在同一图像上给出相同的输出

magento - 将 .csv 导入 Magento 找不到所需的列 : sku

python - 如何导入函数模块并在模块之间传递变量

powershell - 从 psm 函数的脚本 block 中定义的获取变量

javascript - 所需的脚本可以停止其父脚本的执行吗?

python - 使用 csv 模块在 Python 中读取 csv 文件

python - 为什么mysql connector break ("Lost connection to MySQL server during query"错误)

python - django - last() 和 first() 返回相同的对象

python - F2PY 找不到模块