2016-09-09 6 views
2

Я довольно новичок в python и пытаюсь вызвать функцию python из java.Различные/лучшие подходы для вызова функции python из Java

Мои основные требования таковы:

  • вызов должен быть прозрачным, в том смысле, что она не требует изменения .py файла просто, чтобы он мог быть вызван из Java. Мне может быть предоставлен любой файл python с некоторыми функциями внутри него. Я должен иметь возможность вызывать любую из этих функций, не требуя изменения файла .py.
  • Я хочу, чтобы иметь возможность посылать аргументы обеих примитивных типов (int, String, floats и т.д.) или не являющихся примитивных типов (HashMap, ArrayList) от Java для функции питона и получить обратно возвращенный объект (который может примитивных типов или не-примитивные типы) от python до java.
  • I предпочтительно хочу придерживаться CPython вместо Jython

Есть несколько вариантов, которые я нашел в Интернете. Мало:

  • Использование Jython-х PythonInterpreter, с которым я могу вызвать функцию питона, не требуя каких-либо изменений в файл сценария .py:

    py1.py

    def square2(list): 
        squares = [] 
        for i in list: 
         squares.append(i*i) 
        return squares 
    

    JythonTest.groovy

    import org.python.util.PythonInterpreter 
    import org.python.core.*; 
    
    class JythonTest 
    { 
         static main(def args) 
         { 
          PythonInterpreter pi = new PythonInterpreter() 
          pi.exec("from py1 import square2") 
          PyFunction pf = (PyFunction)pi.get("square2") 
          println pf.__call__(new PyList([1,2,3,4]))[2] //9 
         } 
    } 
    

    Я очень хорошо могу удовлетворить свои потребности. Но это не CPython.

  • Использование ScriptEngine: Это очень похоже на PythonInterpreter. Но снова его Jython. Кроме того, в отличие от PythonInterpreter, мы не можем работать с Jython 2.5+ и не можем напрямую обращаться к PyObjects. Таким образом, этот вариант может быть очень хорошо закрыт.

  • Использование py4j: Cant найти пример, который является минимально в случае Jython PythonInterpreter
  • Использование java2python. Но not much information is given о вызове python из java, чтобы я мог заключить, могут ли быть удовлетворены мои вышеуказанные требования. Может ли кто-нибудь пролить свет на это? Более конкретно, если мы сможем записать код как минимальный, как в Jython PythonInterpreter.
  • Использование JPype: Однако после быстрого прохождения я чувствую, что не буду писать минимальный код, как в случае с Jython PythonInterpreter. Также я почувствовал, что проект несколько не развивается. Это?

Кажется, что Jython PythonInterpreter - лучший выбор, если я правильно понял все вышеприведенные подходы. Я сделал ошибки, хватая их? Также есть ли другой лучший вариант?

+0

Не совсем связано, но есть ли какая-то особая причина, по которой вы предпочитаете использовать CPython над Jython? Марширование типов данных между Java и CPython будет сложнее, и с Jython, построенным поверх JVM-взаимодействия, должно быть проще. – UnholySheep

+0

, потому что я чувствую, что Jython будет немного медленнее, чем CPython, также может быть, потому что мне, возможно, придется ждать появления новых библиотек в CPython, но все же прийти в Jython – Mahesha999

+1

У меня никогда не было проблем с производительностью Jython в моих случаях использования (может, конечно, быть другим в вашем). Доступность библиотеки, конечно, потенциальная проблема, однако, если вы точно не знаете, что вам нужно использовать библиотеку, недоступную для Jython, я думаю, что проще использовать ее вместо CPython. (Это то, что я обычно делал, так как я не знал о каких-либо библиотеках клея, которые бы позволили вам использовать такой способ взаимодействия) – UnholySheep

ответ

1

Нет актуального ответа на эту проблему. Использование CPython основывается на выполнении байт-кодов Python, что, в свою очередь, требует, чтобы интерпретатор Python был встроен в среду исполнения. Поскольку никакая среда выполнения Java не поставляется со встроенным интерпретатором Python, это действительно выглядит так, как если бы Jython был лучшим ответом.

Иногда ответ, который вы хотите, просто недоступен!

 Смежные вопросы

  • Нет связанных вопросов^_^