如何在整个应用程序中访问变量/对象?

时间:2012-11-29 13:15:12

标签: python plugins importerror

我正在开发一个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?

谢谢!

2 个答案:

答案 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()

请注意,我更改了命名,以便实例名称不会影响类名。

相关问题