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

Python: how to import from all modules in dir?

目录结构:

1
2
3
4
main.py
my_modules/
   module1.py
   module2.py

模块1.py:

1
2
3
4
5
class fooBar():
    ....
class pew_pew_FooBarr()
    ....
...

如何在不带前缀的情况下将所有类从module*添加到main(即使用foo=foobar(),而不是foo=my_modules.module1.foobar())。

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

1
2
3
4
from my_modules.module1 import *
from my_modules.module2 import *
from my_modules.module3 import *
...

但我不想在创建新模块时更改main.py。有解决办法吗?

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

upd:这个问题不同于这个在python文件夹中加载所有模块的问题,因为我的问题是加载没有名称空间的模块。


my_modules文件夹中,添加一个__init__.py文件,使其成为合适的包。在该文件中,您可以在__init__.py文件的全局范围内注入这些模块的全局,这使得它们在导入模块时可用(在您还将全局名称添加到__all__变量之后):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
__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)

现在,不要这样做:

1
from my_modules.class1 import Stuff

你只需做:

1
from my_modules import Stuff

或者将所有东西导入全球范围,这似乎是您想要做的:

1
from my_modules import *

这种方法的问题是类相互覆盖,因此如果两个模块提供Foo,那么您只能使用上次导入的模块。