Запустите функцию Python с аргументами из Java, используя Jython - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу выполнить функцию Python, которая находится в одном из моих проектов Python из Java с использованием jython.https://smartbear.com/blog/test-and-monitor/embedding-jython-in-java-applications/ дает пример кода для этой цели.Но в моем сценарии я получил следующее исключение:

Исключение в потоке "main" Traceback (последний вызов был последним): файл "", строка 1, в ImportError: нет модуля с именем JythonTestModule

Мой сценарий выглядит следующим образом.

  1. Я создал модуль python внутри моего проекта python (pythonDev) с помощью PyCharm (JythonTestModule.py), который содержит следующую функцию.

    def square (значение): возвращаемое значение * значение

  2. Затем я создал образец класса Java в своем проекте Java (javaDev) и вызвал модуль Python.

    public static void main(String[] args) throws PyException{
       PythonInterpreter pi = new PythonInterpreter();
       pi.exec("from JythonTestModule import square");
       pi.set("integer", new PyInteger(42));
       pi.exec("result = square(integer)");
       pi.exec("print(result)");
       PyInteger result = (PyInteger)pi.get("result");
       System.out.println("result: "+ result.asInt());
       PyFunction pf = (PyFunction)pi.get("square");
       System.out.println(pf.__call__(new PyInteger(5)));
    }     
    

    После запуска этого java-метода вышеупомянутое исключение генерируется java-программой.Я хочу знать, в чем проблема с этими сегментами кода.

1 Ответ

0 голосов
/ 11 февраля 2019

На основании предложений, приведенных в разделе комментариев выше этого вопроса, я разработал решение своего вопроса.Следующий фрагмент кода продемонстрирует это.В этом решении я установил python.path в качестве пути каталога к файлу моего модуля.

public static void main(String[] args) throws PyException{
       Properties properties = new Properties();
       properties.setProperty("python.path", "/path/to/the/module/directory");
       PythonInterpreter.initialize(System.getProperties(), properties, new String[]{""});
       PythonInterpreter pi = new PythonInterpreter();
       pi.exec("from JythonTestModule import square");
       pi.set("integer", new PyInteger(42));
       pi.exec("result = square(integer)");
       pi.exec("print(result)");
       PyInteger result = (PyInteger)pi.get("result");
       System.out.println("result: "+ result.asInt());
       PyFunction pf = (PyFunction)pi.get("square");
       System.out.println(pf.__call__(new PyInteger(5)));
    }

Если вы хотите , используйте несколько модулей из Jython добавьте python.path как путь к родительскому каталогу всех модулей , чтобы обнаружить все модули.

...