我在尝试运行嵌入在已编译的groovy应用程序中的jython代码时遇到了麻烦。嵌入java应用程序(The Grinder 3.1)
时,相同的jython代码可以正常工作在groovy代码中,我使用org.python.util.PythonInterpreter类(来自jython 2.2.1)来创建一个名为TestRunner的类的可调用实例(这是The Grinder的一个要求)。
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
以下是运行上述代码时的输出:
__call__()
方法将调用A类实例的work()
方法,并打印Web服务存根的toString输出。AttributeError: 'javainstance' object has no attribute '__call__'
。 stacktrace以self.b.methodcall()
您是否知道为什么调用self.b.methodcall()
会导致AttributeError: 'javainstance' object has no attribute __call__
为问题添加一些上下文...
*.py
文件和配置文件等,但只有其中一部分用于一个特定的测试场景。所有这些都用于某些测试场景。因此,我用来找出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来启动该过程。