Python:从文件夹导入每个模块?

Python: import every module from a folder?

告诉python从某个文件夹导入所有模块的最好方法(read:cleanest)是什么?

我想允许人们将他们的"mods"(模块)放在我的应用程序的文件夹中,我的代码应该在每次启动时检查并导入放在那里的任何模块。

我也不想在导入的内容中添加额外的作用域(不是"myfolder.mymodule.something",而是"something")。


如果在模块中转换文件夹本身,通过使用__init__.py文件和使用from import *适合您,则可以迭代文件夹内容。使用"os.listdir"或"glob.glob",导入每个以".py"结尾的文件,并使用__import__内置函数:

1
2
3
4
5
6
7
import os
for name in os.listdir("plugins"):
    if name.endswith(".py"):
          #strip the extension
         module = name[:-3]
         # set the module name in the current global name space:
         globals()[module] = __import__(os.path.join("plugins", name)

这种方法的好处是:它允许您动态地将模块名传递给__import__—而import语句需要对模块名进行硬编码,并且它允许您在导入文件之前检查有关文件的其他内容—可能是文件大小,或者是导入某些必需的模块。


创建名为的文件

1
 __init__.py

在文件夹中导入文件夹名,如下所示:

1
2
>>> from <folder_name> import * #Try to avoid importing everything when you can
>>> from <folder_name> import module1,module2,module3 #And so on


你可能想试试这个项目:https://gitlab.com/aurelien-lourot/importdir

使用这个模块,您只需要写两行就可以从目录中导入所有插件,而不需要额外的__init__.py(或任何其他额外文件):

1
2
import importdir
importdir.do("plugins/", globals())