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

8

如何最好(即最干净)地告诉Python从某个文件夹导入所有模块?

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

我也不希望导入的内容添加额外的作用域(不是“myfolder.mymodule.something”,而是“something”)


请在此处检查类似的线程及其答案:https://dev59.com/0XVC5IYBdhLWcg3wfhGL - vaisakh
3个回答

7
如果您希望将文件夹本身转换为模块,可以通过使用__init__.py文件和使用from <foldername> import *来实现。您可以使用"os.listdir"或"glob.glob"迭代文件夹内容,并使用内置函数__import__导入以".py"结尾的每个文件:
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__ - 而ìmport语句需要硬编码模块名称,并且它允许您在导入之前检查文件的其他信息 - 也许是大小,或者是否导入了某些必需的模块。

这在Python3.6中仍然有效,但是最后一行更改为: import importlib; importlib.import_module("plugins" + "." + module) - Jason Wheeler
谢谢 - 他们已经废弃了在 __import__ 中使用文件名的方法。该函数仍然有效,只需在那里使用 ".",而不是 os.path.join - jsbueno

2
创建一个名为的文件
 __init__.py

进入文件夹并像这样导入文件夹名称:

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

那么,如同答案中所建议的那样,在os.path列表中添加文件夹并导入您需要的内容。 - luke14free

0
你可能想尝试这个项目:https://gitlab.com/aurelien-lourot/importdir 使用这个模块,你只需要写两行代码就可以从你的目录中导入所有插件,而且你不需要额外的__init__.py文件(或任何其他额外的文件):
import importdir
importdir.do("plugins/", globals())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接