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

时间:2013-05-31 08:16:19

标签: python import module

目录结构:

main.py
my_modules/
   module1.py
   module2.py

module1.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 *
...

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

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

UPD:这个问题与这个Loading all modules in a folder in Python不同,因为我的问题是加载没有命名空间的模块。

1 个答案:

答案 0 :(得分:28)

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,那么您将只能使用最后导入的模块。