我正在开发一个 PyQT 应用程序。该应用程序能够从数据库中加载一些数据,然后对这些数据进行各种分析。所有这些都有效。但由于分析可能相当复杂,并且不是唯一的用户,我不得不开发一个用户定义脚本的系统。基本上,有一个文本编辑器,用户可以在其中编写自己的小型 python 脚本(带有函数)。然后用户可以通过将文件加载为模块(在应用程序内)来保存或执行脚本。
在这里,有我的应用程序的简化版本。
应用程序的核心位于 My_apps.py 中,插件位于同一文件夹中,即 Plugin_A.py
这是 My_apps.py 的代码:
import sys,os
class Analysis(object):
def __init__(self):
print "I'm the core of the application, I do some analysis etc..."
def Analyze_Stuff(self):
self.Amplitudes_1=[1,2,3,1,2,3]
class Plugins(object):
def __init__(self):
newpath = "C:\Users\Antoine.Valera.NEUROSECRETION\Desktop\Model" #where the file is
sys.path.append(newpath)
Plugin_List=[]
for module in os.listdir(newpath):
if os.path.splitext(module)[1] == ".py":
module=module.replace(".py","")
Plugin_List.append(module)
for plugin in Plugin_List:
a=__import__(plugin)
setattr(self,plugin,a)
def Execute_a_Plugin(self):
Plugins.Plugin_A.External_Function(self)
if __name__ == "__main__":
Analysis=Analysis()
Plugins=Plugins()
Plugins.Execute_a_Plugin()
这是 Plugin_A.py 的代码示例
def External_Function(self):
Analysis.Analyze_Stuff()
print Analysis.Amplitudes_1
为什么我会得到:
Traceback (most recent call last):
File "C:\Users\Antoine.Valera.NEUROSECRETION\Desktop\Model\My_Apps.py", line 46, in <module>
Plugins.Execute_a_Plugin()
File "C:\Users\Antoine.Valera.NEUROSECRETION\Desktop\Model\My_Apps.py", line 37, in Execute_a_Plugin
Plugins.Plugin_A.External_Function(self)
File "C:\Users\Antoine.Valera.NEUROSECRETION\Desktop\Model\Plugin_A.py", line 8, in External_Function
Analysis.Analyze_Stuff()
NameError: global name 'Analysis' is not defined
但是如果我添加以下两行而不是Plugins.Execute_a_Plugin()
Analysis.Analyze_Stuff()
print Analysis.Amplitudes_1
然后,它起作用了。
我如何向每个动态加载的插件表明他必须使用 Analysis 中已经存在的变量/对象?为什么我不能从插件中打印 Analysis.Amplitudes_1?
谢谢!!