Groovy jython2.2.1属性错误:';javainstance';对象没有属性'__调用';

Groovy jython2.2.1属性错误:';javainstance';对象没有属性'__调用';,groovy,jython,grinder,Groovy,Jython,Grinder,我在尝试运行嵌入在已编译groovy应用程序中的jython代码时遇到问题。同样的jython代码在嵌入java应用程序(Grinder 3.1)时也可以正常工作 在groovy代码中,我使用org.python.util.PythonInterpreter类(来自jython 2.2.1)创建一个名为TestRunner的类的可调用实例(这是Grinder的要求) 示例性jython代码示例: 以下是我运行上述代码时的输出: TestRunners\uuu call\uu()方法将调用a类实例

我在尝试运行嵌入在已编译groovy应用程序中的jython代码时遇到问题。同样的jython代码在嵌入java应用程序(Grinder 3.1)时也可以正常工作

在groovy代码中,我使用org.python.util.PythonInterpreter类(来自jython 2.2.1)创建一个名为TestRunner的类的可调用实例(这是Grinder的要求)

示例性jython代码示例: 以下是我运行上述代码时的输出:

  • TestRunners
    \uuu call\uu()
    方法将调用a类实例的
    work()
    方法,并打印webservice存根的toString输出
  • 打印“Calling methodcall”消息
  • “In methodcall”消息从未打印,而是得到:
    AttributeError:'javainstance'对象没有属性'\u调用'
    。stacktrace以self.b.methodcall()结尾。
  • 你知道为什么调用
    self.b.methodcall()
    会导致
    AttributeError:'javainstance'对象没有属性\uuuu调用\uuuu

    为问题添加一些上下文

  • 我试图使用Groovy类来执行Grinder worker线程在我们测试产品性能时所执行的工作。
    • 我使用groovy只是为了“减少冗长的代码”,但如果是groovy导致了这个问题,我可能不得不切换到普通的旧java
  • 这样做的原因是我需要找出Grinder在给定的测试场景中实际使用了哪些文件。
    • 我们有数百个
      *.py
      文件和配置文件等,但其中只有一个子集用于一个特定的测试场景。所有这些都在一些测试场景中使用
    • 这使得“初学者”很难理解如何配置测试,因此我正在尝试构建一个“测试配置器向导”,它可以在不强制用户/测试人员手动编辑所有配置文件的情况下设置测试场景
    • 此向导将从“存储库”中收集相关文件,并将其放在“研磨机控制台”可以向用户显示的文件夹中
  • 因此,我用来找出Grinder使用哪些文件的方法是使用AOP(AspectJ)从
    org.python.util
    org.python.core
    包中的任何代码捕获对
    java.io.FileInputStream(java.io.File)
    的所有调用。 我对这些连接点的“建议”是将文件名打印到
    System.out
    。 我使用加载时编织来实现这一点,因此我可以使用我们的代码运行groovy/java/jython代码 已启用AOP。无论是否启用AOP,都会出现
    AttributeError
    问题

    我模糊地怀疑,
    AttributeError
    问题可能是由“groovy”类执行PythonInterpreter方法时的类加载器不匹配引起的,但我对此并不确定。 我不确定groovy在加载类时是否在执行任何类型的运行时字节码编辑,以及这是否会混淆Python脚本


    groovy代码本身是预编译的,所以我使用常规的java.exe来启动该进程。

    很明显,错误消息是因为有东西试图访问
    \uuuu call\uu()
    对象的
    javainstance
    成员,而该成员不存在。假设上面的代码没有使用
    javainstance
    对象或
    \uuuu调用
    方法处理您所说的错误所在的位置,那么这里肯定缺少真实代码中的一些额外细节。您能否创建整个项目的一个副本,然后将其精确地细化到仍然会产生错误的尽可能小的代码?此外,还有一个问题:您的类应该从对象继承,尽管您的实际代码可能已经在这样做了,而您只是忘了将其放在这里。这是我尝试运行Grinder(jython)时的stacktrace来自Groovy的脚本:回溯(最近一次调用):文件“”,第80行,在调用文件“C:\Users\ola\Documents\Workspace\QA\U dev\Performance\Grinder\。\actors\admin\U soaptester\U mc.py”的第214行,在工作f(self)文件“C:\Users\ola\Documents\Workspace\QA\U dev\Performance\Grinder\。\actors\admin\U soaptester\U mc.py”的第103行,在_getMoneyStatsself.soap.getTotalBalance()AttributeError:'javainstance'对象没有属性'call'中,admin_soaptester_mc.py当然由代码中的“A”类表示example@camjackson关于“挑剔”,实际代码中的jython类都没有指定它们扩展对象。它(在研磨机中)仍然有效。应该是
    类A(对象):
    还是
    导入java.lang.object\n类A(对象):
    才正式正确?
    class TestRunner:
        def __init__(self):
            doinitstuff()
        def __call__():
            a = A()
            a.work()
    
    class A:
        def __init__(self):
            self.b = B()
    
        def work(self):
            print "Calling methodcall"
            self.b.methodcall()
    
    class B:
        def __init__(self):
            self.webservice = WebServiceStubImplementedInJava()
            print str(self.webservice)
    
        def methodcall(self):
            print "In methodcall"
            try:
                return self.webservice.soapmethod()
            except:
                log_error()
                raise