我想为我的剧本制作一个插件系统。
如何加载插件
插件是存储在指定文件夹中的python模块。
我使用以下代码导入模块:
class Igor:
# ...
def load_plugins(self):
for file in os.listdir(self.plugins_folder):
try:
__import__(file)
except Exception as error:
sys.exit(error)
# ...
我希望在插件中提供的变量
我有一个名为igor
的变量,它是Igor
的实例:
if __name__ == "__main__":
# ...
igor = Igor()
# ...
我希望插件开发人员能够做什么
我想简化插件开发,igor
拥有简化插件所需的所有方法。
充其量应该是这样的(在__init__.py
中):
from plugins.files.files import Files
igor.register_plugin("files", Files())
我该怎么做?
我真的不知道如何在我的主脚本中执行此globals()
显示igor
但是菜单中的全局变量中没有任何内容(正如模块所预期的那样,它是沙箱我想的)。
有什么想法吗?
答案 0 :(得分:1)
您需要更改Igor类的load_plugins方法:
def load_plugins(self):
if not os.path.exists(self.plugins_folder):
os.makedirs(self.plugins_folder)
plugin_folder_content = os.listdir(self.plugins_folder)
for content in plugin_folder_content:
content_path = os.path.join(self.plugins_folder, content)
if os.path.isdir(content_path):
plugin_entry_point_path = os.path.join(content_path, "__init__.py")
if os.path.exists(plugin_entry_point_path):
try:
with open(plugin_entry_point_path, 'r') as file:
sys.path.insert(1, content_path)
exec(compile(file.read(), "script", "exec"), {"igor": self, "IgorPlugin": IgorPlugin, 'path': content_path})
sys.path.remove(content_path)
except Exception as exc:
sys.exit(exc)
这会产生另一个问题:因为我们在每个子目录上定义的每个模块上执行 init .py文件,所以无法轻松导入文件,这就是我传递路径变量的原因,要手动导入文件,这是一个假想的 init .py文件的示例,它导入files.py插件:
import os
files_path = os.path.join(path, "files.py")
exec(compile(open(files_path).read(), "script", "exec"), {"igor": igor, "IgorPlugin": IgorPlugin})