2009-07-22 4 views
52

Возможный дубликат:
Java Python IntegrationИспользование Python внутри Java

У меня есть большая существующая кодовая написана на 100% Java, но я хотел бы использовать Python для некоторых новых разделов этого. Мне нужно сделать некоторую обработку текста и языка, и я бы предпочел использовать Python и библиотеку, например NLTK.

Я знаю проект Jython, но похоже, что это способ использования Java и его библиотек из Python, а не наоборот - я ошибаюсь в этом?

Если нет, то какой был бы лучший способ взаимодействия между Java и Python, так что (в идеале) я могу вызвать метод в Python и вернуть результат на Java?

Спасибо.

+0

См http://stackoverflow.com/questions/1119696/java-python-integration –

+0

удачи с вашим проектом ... если вы «Успешно, возможно, остановитесь на моем вопросе и дайте ему немного любви ... er ответьте на это: http://stackoverflow.com/questions/1075905/class-file-from-jython-with-pydev – Victor

ответ

33

Я знаю проекта Jython, но это выглядит следующим образом представляет собой путь к использования Java и его библиотек внутри Python, а не наоборот раунд - я неправильно об этом?

Да, вы ошибаетесь. Вы можете либо call a command line interpreter запустить код Python с помощью Jyton, либо use python code from Java.Раньше был также компилятор python-to-Java, но он был прекращен с Jython 2.2

+0

Спасибо. Мне нравится интерпретаторный подход с лучшим интерфейсом, но мне нужно будет сделать позвоните, могу ли я позволить себе поразить производительность или скомпилированный подход. Но спасибо и всем ответчикам. – Liam

+7

Просто добавьте, что подход jythonc устарел для того, чтобы напрямую обращаться к интерпретатору python. – dgorissen

+1

Просто для правильной работы вам все равно нужна среда/библиотеки python/etc, установленная в вашей системе? – nsn

0

Просто запустите интерпретатор Python в качестве подпроцесса из Java.

Напишите свою функциональность Python как правильный скрипт, который читает из stdin и записывает на stdout.

Используйте класс Java Runtime, чтобы создать подпроцесс, который запускает ваш скрипт на Python. Это очень просто сделать и обеспечивает очень чистый интерфейс.


Редактировать

import simplejson 
import sys 
for request in sys.stdin.readlines(): 
    args = simplejson.loads(request) 
    result = myFunction(args['this'], args['that']) 
    sys.stdout.writeline(simplejson.dumps(result) + "\n") 

Интерфейс прост, структурированный и очень низкие накладные расходы.

+1

Это не правда хороший способ взаимодействия между 2, они не смогут вызвать метод в Pyton и вывести его на Java. –

+0

Я бы сказал, что интерфейс является противоположным чистым, поскольку связь полностью неструктурирована и требует дополнительной логики синтаксического анализа. –

+0

Согласитесь: он может немного запутаться с использованием Java Runtime: избегайте этого, если вам действительно не нужно. Вы должны быть осторожны, чтобы не вводить проблемы с переносимостью, вам нужно обработать статус возврата; вам, возможно, придется обрабатывать неверные процессы и т. д .; вы теряете много контроля, делая это. – monojohnny

2

Jython - это реализация Python, запущенная на JVM. Вы можете найти информацию о внедрении Python в существующем приложении Java в user guide.

Я не знаю среды, в которой вы работаете, но помните, что смешивание языков в одном приложении может быстро привести к беспорядку. Я рекомендую создавать интерфейсы Java для представления операций, которые вы планируете использовать, наряду с отдельными пакетами реализации, которые обертывают код Python.

6

Я бы написал модуль Python для обработки текста и языка, а затем построил небольшой мост в jython, с которым может взаимодействовать ваша Java-программа. Мост jython будет очень простым, на самом деле он отвечает только за пересылку вызовов в модуль python и возвращает ответ от модуля python на модуль java. Jython очень прост в использовании, и настройка не должна занимать вас более 15 минут.

Удачи!

+0

Мне нравится эта идея. можно указать на пример PLS – KillBill

+0

, или же зачем вам нужно jython для вызова скрипта python, когда вы можете использовать Process.exec или ProcessBuilder? – KillBill

2

На мой взгляд, Jython - это именно то, что вы смотрите.
Реализация Python в JVM; Таким образом, вы можете свободно обменивать объекты и, например, наследовать от класса Java (с некоторыми ограничениями). Обратите внимание, что его основная точка силы (находящаяся на вершине JVM) также является ее основным недостатком, поскольку она не может использовать все (C) расширение Python, написанное на C (или на любом другом скомпилированном языке); это может повлиять на то, что вы готовы сделать с обработкой текста.

Для получения дополнительной информации о том, что такое Jython, его потенциал и его ограничения, я предлагаю вам прочитать Jython FAQ.

4

Я не думаю, что вы могли бы использовать NLTK из Jython, так как это зависит от Numpy, который не переносится на JVM. Если вам нужно NLTK или любое другое родное расширение CPython, вы можете рассмотреть возможность использования некоторого механизма IPC для связи между CPython и JVM. Это, как говорится, есть проект, чтобы позволить вызова CPython из Java, называется Jepp:

http://jepp.sourceforge.net/

Реверс (вызов Java кода из CPython) является целью JPype и JavaClass:

SourceForge. нетто/проекты/jpype/

pypi.python.org/pypi/javaclass/0.1

Я никогда не использовал ни одного из этих проектов, поэтому я cant't обет за их качество.

0

Не забудьте сначала проверить у тех, кто платит за разработку, что они в порядке с кодовой базой, требующей разработчика, который знает и Python и Java с этого момента, и другие эффекты затрат и ремонтопригодности, которые вы, несомненно, уже учли.

См: http://www.acm.org/about/se-code 1,06, 2,03, 2,09, 4,03, 4,05, 6,07