如何最好(即最干净)地告诉Python从某个文件夹导入所有模块?
我想允许用户将他们的“mods”(模块)放在我的应用程序中的一个文件夹中,在每次启动时,我的代码应该检查并导入任何放在那里的模块。
我也不希望导入的内容添加额外的作用域(不是“myfolder.mymodule.something”,而是“something”)
如何最好(即最干净)地告诉Python从某个文件夹导入所有模块?
我想允许用户将他们的“mods”(模块)放在我的应用程序中的一个文件夹中,在每次启动时,我的代码应该检查并导入任何放在那里的模块。
我也不希望导入的内容添加额外的作用域(不是“myfolder.mymodule.something”,而是“something”)
__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语句需要硬编码模块名称,并且它允许您在导入之前检查文件的其他信息 - 也许是大小,或者是否导入了某些必需的模块。import importlib; importlib.import_module("plugins" + "." + module)
。 - Jason Wheeler__import__
中使用文件名的方法。该函数仍然有效,只需在那里使用 ".",而不是 os.path.join
。 - jsbueno __init__.py
进入文件夹并像这样导入文件夹名称:
>>> from <folder_name> import * #Try to avoid importing everything when you can
>>> from <folder_name> import module1,module2,module3 #And so on
__init__.py
文件(或任何其他额外的文件):import importdir
importdir.do("plugins/", globals())