2013-02-14 12 views
13

Nota: Ho trovato la soluzione e ho risposto a me stesso. Tuttavia, non ho idea del perché quell'impostazione fosse sbagliata e abbia causato il problema. Sono ancora interessato ad avere una buona spiegazione su come funziona il sistema di importazione Jython; se qualcuno si preoccupa di ottenere la grazia, per favore risponda a questo.Impossibile importare classi Java dal modulo Jython


Sto lavorando a un progetto Java EE esistente in cui ho bisogno di fare calcoli in Python. Sono alle prime fasi dei test di integrazione ma sto già affrontando un problema. Ho letto Chapter 10 of Jython book ma non riesco ancora a trovare una soluzione. Leggo anche Chapter 8 (Moduli e pacchetti per il riutilizzo del codice) ma per me non è chiaro.

Una spiegazione di come funziona il sistema di importazione Jython e come configurarlo sarebbe molto apprezzato.

Il problema:

$ jython -v 
import: 'exceptions' as org.python.core.exceptions in builtin modules 
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35) 
[Java HotSpot(TM) Server VM (Oracle Corporation)] on java1.7.0_10 
import: import site # precompiled from /home/me/jython/2.5.3/Lib/site$py.class 
import: 'sys' as sys in builtin modules 
import: import os # precompiled from /home/me/jython/2.5.3/Lib/os$py.class 
import: 'errno' as org.python.modules.errno in builtin modules 
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules 
import: import posixpath # precompiled from /home/me/jython/2.5.3/Lib/posixpath$py.class 
import: import stat # precompiled from /home/me/jython/2.5.3/Lib/stat$py.class 
import: 'java' as java package 
import: 'File' as java class 
import: 'IOException' as java class 
import: 'org' as java package 
import: 'Py' as java class 
Type "help", "copyright", "credits" or "license" for more information. 

>>> import pendulum.generator.BuildingType 
import: import pendulum # precompiled from /path/to/project/build/classes/pendulum/__init__$py.class 
import: import pendulum.generator # precompiled from /path/to/project/build/classes/pendulum/generator/__init__$py.class 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named BuildingType 

La mia domanda è: Che cosa sto facendo di sbagliato e come posso risolvere le cose per importare l'interfaccia BuildingType successo? Forse il problema sta in CLASSPATH, ma non ho idea di quale valore potrebbe essere appropriato.


organizzazione Codice:

$ tree build/classes/pendulum/generator/ src/pendulum/generator/ 
build/classes/pendulum/generator/ 
├── BuildingType.class 
├── __init__.py 
└── __init__$py.class 

src/pendulum/generator/ 
├── BuildingType.java 
└── __init__.py 

Importa percorso definito da un private Jython registry file:

$ cat ~/.jython 
python.path=\ 
/path/to/project/build/classes:\ 
/path/to/project/src:\ 
/home/me/jdevel/extras/2.5.3/Lib:\ 
/home/me/jdevel/extras/2.5.3/Lib/site-packages 

Sono sicuro Jython raccoglie i percorsi perché ho controllato che con sys.path al prompt di Jython.

BuildingType.java

package pendulum.generator; 

public interface BuildingType { 
    public String getBuildingName(); 
    public String getBuildingAddress(); 
    public String getBuildingId(); 
} 
+0

provare "da pendolo.Generatore di importazione BuildingType" – sarwar

+0

ImportError:? Non è possibile importare nome BuildingType – Paolo

+1

è jython.jar in jre/lib/ext –

risposta

4

Dopo un sacco di tempo sprecato nell'approccio try/catch sono riuscito a trovare la risposta da solo.

.jython hanno assomigliare a questo:

python.path=\ 
/path/to/project/build:\ 
/path/to/project/src:\ 
/home/me/jdevel/extras/2.5.3/Lib:\ 
/home/me/jdevel/extras/2.5.3/Lib/site-packages 

Non questo:

python.path=\ 
/path/to/project/build/classes:\ 
/path/to/project/src:\ 
/home/me/jdevel/extras/2.5.3/Lib:\ 
/home/me/jdevel/extras/2.5.3/Lib/site-packages 

In particolare, aggiungendo /path/to/project/build/classes al percorso di importazione è sbagliato (anche se riflette la gerarchia del filesystem), mentre /path/to/project/build ha ragione e ha risolto il problema.

4

è necessario impostare CLASSPATH così come python.path.

Con la stessa struttura delle directory, questo funziona per me:

jython10$ CLASSPATH=build/classes/ jython -v Building.py 
import: 'exceptions' as org.python.core.exceptions in builtin modules 
import: import site # precompiled from /usr/local/Java/jython2.5.3/Lib/site$py.class 
import: 'sys' as sys in builtin modules 
import: import os # precompiled from /usr/local/Java/jython2.5.3/Lib/os$py.class 
import: 'errno' as org.python.modules.errno in builtin modules 
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules 
import: import posixpath # precompiled from /usr/local/Java/jython2.5.3/Lib/posixpath$py.class 
import: import stat # precompiled from /usr/local/Java/jython2.5.3/Lib/stat$py.class 
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum' 
import: 'pendulum' as java package 
import: 'pendulum' as java package 
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum/generator' 
import: 'pendulum.generator' as java package 
import: 'BuildingType' as java class 

Riferimento: Working with CLASSPATH (Jython Book).

+0

Grazie mille. Senza impostare classpath, non ero in grado di utilizzare le mie classi dalla riga di comando ('java.lang.ClassNotFoundException'). Dall'interno di Eclipse tutto ha funzionato bene, però. – Paolo