我正在开发一个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
但如果我在行之后添加2行而不是Plugins.Execute_a_Plugin()
Analysis.Analyze_Stuff()
print Analysis.Amplitudes_1
然后,它有效。
我如何向每个动态加载的插件指出他必须使用Analysis中已存在的变量/对象?为什么我不能在插件中打印Analysis.Amplitudes_1?
谢谢!
答案 0 :(得分:0)
您必须导入您的模块。在Plugin_A.py
之上添加以下内容from My_apps import Analysis
A = Analysis()
A.Analyze_Stuff()
print A.Amplitudes_1
答案 1 :(得分:0)
错误消息似乎非常清楚:导入的Plugin_A
模块的命名空间中不存在名称“Analysis”,因此External_Function
无法访问它。
导入Plugin_A
模块时,它无法访问导入模块My_apps
的命名空间中的名称。因此,它无法“看到”您在那里创建的Analysis
类的实例。
一个简单的解决方案是更改External_Function
(和其他相关函数)的签名,以便它可以采用Analysis
类的实例:
Plugin_A.py
:
def External_Function(self, analysis):
analysis.Analyze_Stuff()
print analysis.Amplitudes_1
My_apps.py
:
...
def Execute_a_Plugin(self):
plugins.Plugin_A.External_Function(self, analysis)
if __name__ == "__main__":
analysis = Analysis()
plugins = Plugins()
plugins.Execute_a_Plugin()
请注意,我更改了命名,以便实例名称不会影响类名。