3

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

在 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__()方法将调用work()A 类实例的方法,并打印 Web 服务存根的 toString 输出。
  2. 打印“调用方法调用”消息。
  3. 永远不会打印“In methodcall”消息,而是得到:AttributeError: 'javainstance' object has no attribute '__call__'。堆栈跟踪以self.b.methodcall()

你知道为什么调用self.b.methodcall()应该导致AttributeError: 'javainstance' object has no attribute __call__

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

  1. 我正在尝试使用 Groovy 类来执行 Grinder 工作线程在我们对产品进行性能测试时将执行的工作。
    • 我只是为了“不那么冗长的代码”而使用 groovy,但如果它是导致问题的 groovy,则可能不得不切换到普通的旧 java。
  2. 这样做的原因是我需要找出 Grinder 在给定的测试场景中实际使用了哪些文件。
    • 我们有数百个*.py文件和配置文件等,但其中只有一个子集用于一个特定的测试场景。所有这些都用于某些测试场景。
    • 这使得“初学者”很难理解如何配置测试,因此我正在尝试构建一个“测试配置向导”来设置测试场景,而不强制用户/测试人员手动编辑所有配置文件。
    • 该向导将从“存储库”中收集相关文件,并将它们放在“Grinder 控制台”可以将它们呈现给用户的文件夹中。

因此,我用来找出 Grinder 使用了哪些文件的方法是使用 AOP (AspectJ) 来捕获来自and包java.io.FileInputStream(java.io.File)中任何代码的所有调用。我应用于这些连接点的“建议”是将文件名打印到. 我为此使用加载时编织,因此我可以在未启用 AOP 的情况下运行 groovy/java/jython 代码。无论我是否启用了 AOP,都会出现问题。org.python.utilorg.python.coreSystem.outAttributeError

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

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

4

0 回答 0