1

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

谢谢!!

4

2 回答 2

0

您必须导入您的模块。在 Plugin_A.py 上添加以下内容

from My_apps import Analysis

A = Analysis()
A.Analyze_Stuff()
print A.Amplitudes_1
于 2012-11-29T13:23:34.787 回答
0

Plugin_A错误消息似乎非常清楚:您导入的模块的名称空间中不存在名称“分析” ,因此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()

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

于 2012-11-29T17:44:52.670 回答