jython2.2.1 AttributeError:'javainstance'对象没有属性'__call__'

时间:2011-09-13 21:16:07

标签: groovy jython grinder

我在尝试运行嵌入在已编译的groovy应用程序中的jython代码时遇到了麻烦。嵌入java应用程序(The Grinder 3.1)

时,相同的jython代码可以正常工作

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

说明性的jython代码示例:

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

以下是运行上述代码时的输出:

  1. TestRunners __call__()方法将调用A类实例的work()方法,并打印Web服务存根的toString输出。
  2. " Calling methodcall"消息已打印。
  3. " In methodcall"永远不会打印消息,而是获得:AttributeError: 'javainstance' object has no attribute '__call__'。 stacktrace以self.b.methodcall()
  4. 结尾

    您是否知道为什么调用self.b.methodcall()会导致AttributeError: 'javainstance' object has no attribute __call__

    为问题添加一些上下文...

    1. 我尝试使用Groovy类来执行Grinder工作线程在我们对产品进行性能测试时所执行的工作。
      • 我使用groovy只是为了更简洁的代码",但如果导致问题的groovy可能不得不切换到普通的旧java。
    2. 这样做的原因是我需要找出Grinder实际用于给定测试场景的文件。
      • 我们有数百个*.py文件和配置文件等,但只有其中一部分用于一个特定的测试场景。所有这些都用于某些测试场景。
      • 这对于初学者来说非常困难"了解如何配置测试,以便我尝试构建一个"测试配置器向导"设置测试场景而不强制用户/测试人员手动编辑所有配置文件。
      • 此向导将从"存储库"中收集相关文件。并将它们放在" Grinder Console"可以将它们呈现给用户。
    3. 因此,我用来找出Grinder使用哪些文件的方法是使用AOP(AspectJ)从java.io.FileInputStream(java.io.File)和{{1}中的任何代码捕获对org.python.util的所有调用}包。 "建议"我申请这些连接点是将文件名打印到org.python.core。 我为此使用了加载时编织,因此我可以使用without运行groovy / java / jython代码 启用AOP。无论是否启用AOP,都会出现System.out问题。

      我有一种模糊的怀疑,AttributeError问题可能是由于某些类加载程序不匹配导致的#34; groovy" class执行PythonInterpreter方法,但我对此并不确定。 我不确定groovy在加载类时是否正在执行任何类型的运行时字节码编辑,如果这会混淆PythonInterpreter。

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

0 个答案:

没有答案