Korzystanie z biblioteki java z Pythona

Mam aplikację python i aplikację java. Aplikacja Pythona generuje dane wejściowe dla aplikacji java i wywołuje je w wierszu poleceń.

Jestem pewien, że musi być w tym bardziej eleganckie rozwiązanie; podobnie jak używanie JNI do wywoływania kodu C Z Javy.

Jakieś wskazówki? (FYI I ' m V. new to Python)

Wyjaśnienie (kosztem długiego pytania: przeprosiny) Aplikacja py (której nie posiadam) pobiera dane użytkownika w postaci kilku plików konfiguracyjnych. Następnie interpruje te a farmy działają na wiele (ukrytych) narzędzi za pomocą mechanizmu wtyczek. Chcę dodać obsługę funkcjonalności starszej aplikacji Java.

Więc nie ma sensu wywoływać aplikacji Pythona z aplikacji java i nie mogę uruchomić aplikacji py w środowisku jython (na JVM).

Ponieważ nie ma na to oczywistego mechanizmu, myślę, że proste wywołanie CL jest najlepszym rozwiązaniem.

Author: Jim, 2009-01-25

6 answers

Sorry, że wskrzesiłem wątek, ale nie było zaakceptowanej odpowiedzi...

Możesz również użyć Py4J . Na stronie głównej znajduje się przykład i mnóstwo dokumentacji, ale zasadniczo, po prostu wywołujesz metody Javy z kodu Pythona, tak jakby były to metody Pythona:

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

W przeciwieństwie do Jythona, Py4J działa w maszynie wirtualnej Pythona, więc jest zawsze "na bieżąco" z najnowszą wersją Pythona i możesz używać bibliotek, które nie działają dobrze na Jythonie (np. lxml). Na komunikacja odbywa się za pośrednictwem gniazd zamiast JNI.

Zastrzeżenie: jestem autorem Py4J

 51
Author: Barthelemy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-26 22:44:28

Spójrz na Jython . To trochę jak JNI, ale zastąp C Pythonem, tzn. możesz wywoływać Pythona z Javy i vice versa. Nie jest do końca jasne, co próbujesz zrobić lub dlaczego twoje obecne podejście nie jest tym, czego chcesz.

 8
Author: Dave Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-25 00:46:46

Zawiń swój kod Java w kontenerze (Servlet / EJB).

Więc nie tracisz czasu w vm-startup i idziesz drogą do bardziej zorientowanych na usługi.

Do owijania możesz użyć jython ( tylko jeśli znasz python )

Wybierz protokół komunikacyjny, w którym można używać Pythona i Javy:

  • json (zobacz www.json.org)
  • rmi (Python: JPype)
  • reszta
  • mydło (tylko dla brave)

Wybierz coś, z czym ty lub twoi partnerzy są znani!

 5
Author: Blauohr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-25 10:50:46

Jeśli naprawdę chcesz osadzić swoją aplikację Java w swoim procesie Pythona, spójrz na JPype. Zapewnia dostęp do Javy za pośrednictwem JNI.

 5
Author: Stéphane Bonniez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 12:18:07
 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 12:38:23

Daj JCC spróbować http://pypi.python.org/pypi/JCC/2.1

JCC jest generatorem kodu do wywoływania Javy bezpośrednio z CPython. Obsługuje CPython 2.3+, kilka JRE (Sun JDK 1.4+, Apple JRE 1.4+ i OpenJDK 1.7) W systemach OS X, Linux, Solaris i Windows. Jest produkowany przez Open Source Application Foundation (OSAF, the people making) i jest wydany na licencji w stylu Apache.

Z opisu pakietu:

JCC jest generatorem kodu C++ dla tworzenie kodu kleju niezbędnego do wywołania klas Javy z CPython poprzez natywny interfejs wywoływania Javy (JNI).

JCC generuje klasy wrapperów C++, które ukrywają wszystkie krwawe szczegóły dostępu do JNI, a także zarządzanie pamięcią Javy i obiektami.

JCC generuje typy CPython, które czynią te klasy C++ dostępnymi z interpretera Pythona. JCC próbuje uczynić te typy Pythona pythonicznym, wykrywając Iteratory i Accesory właściwości. Iteratory i mapowania mogą należy również zgłosić się do WKK.

 2
Author: sstock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 12:54:28