2013-02-14 12 views
13

Uwaga: Znalazłem rozwiązanie i odpowiedziałem sam. Chociaż nie mam pojęcia, dlaczego to ustawienie było złe i spowodowało problem. Nadal jestem zainteresowany dobrym wyjaśnieniem, jak działa system importowania Jython; jeśli ktoś chce zdobyć nagrodę, proszę o odpowiedź.Nie można importować klas Java z modułu Jython


Pracuję nad istniejącym projektem Java EE, w którym muszę wykonać obliczenia w języku Python. Jestem na pierwszych etapach testów integracyjnych, ale już mam problem. Czytam Chapter 10 of Jython book, ale nadal nie mogę znaleźć rozwiązania. Przeczytałem także Chapter 8 (Moduły i pakiety do ponownego użycia kodu), ale dla mnie jest to niejasne.

Bardzo ważne jest wyjaśnienie, jak działa system importowania Jython i jak go skonfigurować.

Problem:

$ 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 

Moje pytanie brzmi: co robię źle i jak to naprawić rzeczy do importu interfejsu BuildingType powodzeniem? Może problem tkwi w CLASSPATH, ale nie mam pojęcia, która wartość mogłaby być odpowiednia.


organizacja Kod:

$ 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 

ścieżka importu zdefiniowany przez 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 

Jestem pewien Jython podnosi ścieżek bo sprawdził, że z sys.path w wierszu Jython.

BuildingType.java

package pendulum.generator; 

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

spróbuj "z wahadła.generator import BuildingType " – sarwar

+0

ImportError: nie można zaimportować nazwy BuildingType – Paolo

+1

Czy plik jython.jar w jre/lib/ext? –

Odpowiedz

4

Po zmarnowanym czasie w podejściu "próbuj/złapię", sam byłem w stanie znaleźć odpowiedź.

.jython mieć wyglądać tak:

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 

Nie tym:

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 

W szczególności dodanie /path/to/project/build/classes do ścieżki importu jest źle (nawet jeśli odzwierciedla hierarchia systemu plików), podczas gdy /path/to/project/build ma rację i rozwiązał problem.

4

Musisz ustawić CLASSPATH jak python.path.

Z tej samej strukturze katalogów działa to dla mnie:

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 

referencyjny: Working with CLASSPATH (Jython Książka).

+0

Wielkie dzięki. Bez ustawienia ścieżki klasy nie mogłem używać moich klas z wiersza poleceń ('java.lang.ClassNotFoundException'). Jednak z poziomu Eclipse wszystko działało dobrze. – Paolo

Powiązane problemy