【问题标题】:Python: how to import from all modules in dir?Python:如何从目录中的所有模块导入?
【发布时间】:2013-05-27 00:15:44
【问题描述】:

目录结构:

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 这个问题不同,因为我的问题是加载没有命名空间的模块。

【问题讨论】:

标签: python import module


【解决方案1】:

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

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

【讨论】:

  • 上面的代码可以放到init.py文件中还是放到别的地方自动导入模块。
  • 正是我想要的。但是,find_module 自 3.3 起已弃用。
  • 非常感谢 - 我一直在寻找这种便携式(zip 或模块)方式来导入包中的所有模块 - 这非常有效!
  • loader.find_module(name).load_module(name) 的更简单替代方法是 importlib.import_module(name)
猜你喜欢
  • 2017-04-03
  • 2012-02-15
  • 1970-01-01
  • 2019-05-31
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多