2009-07-22 15 views
52

Eventuali duplicati:
Java Python IntegrationUsare Python dall'interno Java

Ho una grande base di codice esistente scritto in 100% Java, ma vorrei utilizzare Python per alcune nuove sezioni di esso. Ho bisogno di fare un po 'di elaborazione del testo e del linguaggio, e preferirei usare Python e una libreria come NLTK per farlo.

Sono a conoscenza del progetto Jython, ma sembra che questo rappresenti un modo per usare Java e le sue librerie da Python, piuttosto che il contrario - mi sbaglio di questo?

In caso contrario, quale sarebbe il metodo migliore per interfacciare tra Java e Python, tale che (idealmente) posso chiamare un metodo in Python e avere il risultato restituito a Java?

Grazie.

+0

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

+0

buona fortuna con il vostro progetto ... se il successo potrebbe forse fermarsi dalla mia domanda e dargli un po 'di amore ... e risponderti: http://stackoverflow.com/questions/1075905/class-file-from-jython-with-pydev – Victor

risposta

33

Sono a conoscenza del progetto Jython, ma sembra che questo rappresenta un modo per uso di Java e le sue librerie dall'interno Python, piuttosto che il contrario rotonda - mi sbaglio su questo?

Sì, si sbaglia. È possibile call a command line interpreter eseguire codice Python utilizzando Jyton o use python code from Java.In passato c'era anche un compilatore python-to-Java, ma è stato interrotto con Jython 2.2

+0

Grazie - Mi piace l'approccio dell'interprete con l'interfaccia la migliore, ma dovrò fare un chiedo se posso permettermi il colpo di rendimento contro un approccio compilato. Ma grazie a voi e a tutti i rispondenti. – Liam

+7

Giusto per aggiungere che l'approccio jythonc è stato deprecato in favore di chiamare direttamente l'interprete python – dgorissen

+1

Solo per cose dritte, avresti ancora bisogno dell'ambiente python/librerie/etc installato nel tuo sistema? – nsn

0

Basta eseguire l'interprete Python come sottoprocesso da Java.

Scrivi la tua funzionalità Python come uno script corretto, che legge da stdin e scrive su stdout.

Utilizzare la classe Java Runtime per generare un sottoprocesso che esegue il proprio script Python. Questo è molto semplice da fare e fornisce un'interfaccia molto pulita.


Modifica

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") 

L'interfaccia è semplice, sovraccarico strutturato e molto bassa.

+1

Questo non è proprio un bel modo di interfacciare il 2, non saranno in grado di chiamare un metodo in Pyton e farlo uscire in Java. –

+0

Direi che l'interfaccia è l'opposto di clean, poiché la comunicazione è completamente non strutturata e richiede un'ulteriore logica di analisi. –

+0

Accetto: Può diventare un po 'complicato con Java Runtime: evitarlo a meno che non sia necessario. Devi stare attento a non introdurre problemi di portabilità, devi gestire lo stato di ritorno; potrebbe essere necessario gestire i processi di comportamento anomalo ecc; perdi molto controllo facendo questo. – monojohnny

2

Jython è un'implementazione Python in esecuzione sulla JVM. È possibile trovare informazioni sull'incorporamento di Python in un'applicazione Java esistente nel user guide.

Non conosco l'ambiente in cui lavori, ma tieni presente che mescolare i linguaggi nella stessa app può portare rapidamente a un disastro. Raccomando di creare interfacce Java per rappresentare le operazioni che si intende utilizzare, insieme a classi di implementazione con pacchetto separato che racchiudono il codice Python.

6

Scriverei un modulo Python per gestire l'elaborazione di testo e linguaggio e quindi creare un piccolo bridge in jython con cui il tuo programma java può interagire. Il jython bridge sarà molto semplice, che è veramente solo responsabile per l'inoltro delle chiamate al modulo python e restituisce la risposta dal modulo python al modulo java. Jython è veramente facile da usare e l'installazione non dovrebbe richiedere più di 15 minuti.

Buona fortuna!

+0

mi piace questa idea. puoi puntare ad un esempio pls – KillBill

+0

oppure perché hai bisogno di jython per chiamare uno script python quando puoi usare Process.exec o ProcessBuilder – KillBill

2

A mio parere, Jython è esattamente quello che stai guardando.
È un'implementazione di Python all'interno della JVM; in quanto tale, è possibile scambiare liberamente oggetti e, ad esempio, ereditare da una classe Java (con alcune limitazioni).

Nota che, il suo punto di forza principale (essendo sopra JVM) è anche il suo principale svantaggio, perché non può usare tutte le estensioni (C) Python scritte in C (o in qualsiasi altro linguaggio compilato); questo potrebbe avere un impatto su ciò che sei disposto a fare con l'elaborazione del testo.

Per ulteriori informazioni su cosa sia Jython, il suo potenziale e i suoi limiti, ti suggerisco di leggere lo Jython FAQ.

4

Non penso che si possa usare NLTK da Jython, poiché dipende da Numpy che non è portato su JVM. Se hai bisogno di NLTK o di qualsiasi altra estensione CPython nativa, potresti prendere in considerazione l'utilizzo di un meccanismo IPC per comunicare tra CPython e JVM. Detto questo, c'è un progetto per consentire di chiamare CPython da Java, chiamato Jepp:

http://jepp.sourceforge.net/

L'inverso (chiamando il codice Java da CPython) è l'obiettivo di JPype e JavaClass:

sourceforge. net/progetti/jpype/

pypi.python.org/pypi/javaclass/0.1

ho mai usato uno di questi progetti, così ho cant't voto per la loro qualità.

0

Ricordarsi di controllare prima da quelli che pagano per lo sviluppo che stanno bene con il codebase che necessita di uno sviluppatore che conosce sia Python e Java d'ora in poi, sia altri effetti di costo e di manutenibilità che si sono senza dubbio già considerati.

See: http://www.acm.org/about/se-code 1.06, 2.03, 2.09, 4.03, 4.05, 6.07