jython2.2.1 AttributeError: у объекта 'javainstance' нет атрибута '__call__' - PullRequest
3 голосов
/ 14 сентября 2011

У меня возникают проблемы при попытке запустить код Jython, встроенный в скомпилированное приложение Groovy.Тот же самый 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, и будет выведен вывод toString заглушки веб-службы.
  2. Напечатано сообщение «Calling methodcall».
  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 только ради "менее подробного кода", но, возможно, придется переключиться на обычную старую Java, если она вызывает groovy.
  2. Причина для этого заключается в том, что мне нужно выяснить, какие файлы на самом деле используются Grinder для данного тестового сценария.
    • У нас есть сотни *.py файлов, файлов конфигурации и т. Д., Но только подмножество их используется для одного конкретного тестового сценария.Все они используются в некоторых тестовых сценариях.
    • Это делает довольно трудным для "новичка" понять, как настроить тест, поэтому я пытаюсь создать "тестовый конфигуратор"wizard », который настраивает тестовый сценарий, не заставляя пользователя / тестера редактировать все файлы конфигурации вручную.
    • Этот мастер соберет соответствующие файлы из «репозитория» и поместит их в папку, где «Консоль Grinder» может представить их пользователю.

Итак, я использую, чтобы выяснить, какие файлы используются Grinder, это использовать AOP (AspectJ) для захвата всех вызовов java.io.FileInputStream(java.io.File) из любого кода в пакетах org.python.util и org.python.core.«Совет», который я применяю к этим точкам соединения, состоит в том, чтобы напечатать имя файла на System.out.Для этого я использую время загрузки, поэтому я могу запустить код groovy / java / jython с нашим без AOP.Проблема AttributeError возникает независимо от того, включен я AOP или нет.

У меня есть смутное подозрение, что проблема AttributeError может быть вызвана некоторым несовпадением загрузчиков классов, когда класс "groovy" выполняет методы PythonInterpreter,но я далеко не уверен в этом.Я не уверен, что groovy выполняет какое-либо редактирование байт-кода времени выполнения , когда загружает классы, и если это смущает PythonInterpreter.

Сам код groovy предварительно скомпилирован, поэтому я использую обычный java.exe для запуска процесса.

...