Не удалось импортировать классы Java из модуля Jython
Примечание: Я нашел решение и ответил сам. Хотя, я не знаю, почему эта настройка была неправильной и вызвала проблему. Меня все еще интересует хорошее объяснение того, как работает система импорта Jython; если кто-то хочет получить щедрость, ответьте на это.
Я работаю над существующим проектом Java EE, где мне нужно делать вычисления в Python. Я на первых этапах интеграционных тестов, но я уже сталкиваюсь с проблемой. Я читал главу 10 книги Jython, но до сих пор не могу найти решение. Я также читаю Chapter 8 (Модули и пакеты для повторного использования кода), но для меня это неясно.
Объяснение того, как работает система импорта Jython и как его настроить, будет очень оценено.
Проблема:
$ 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
Мой вопрос: что я делаю неправильно, и как я могу исправить вещи для успешного импорта интерфейса BuildingType? Возможно, проблема стоит в CLASSPATH, но я понятия не имею, какое значение может быть уместным.
Организация кода:
$ 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
Путь импорта, определяемый частным файлом реестра Jython:
$ 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
Я уверен, что Jython выбирает пути, потому что я проверил это с помощью sys.path
в приглашении Jython.
BuildingType.java
package pendulum.generator;
public interface BuildingType {
public String getBuildingName();
public String getBuildingAddress();
public String getBuildingId();
}
Ответы
Ответ 1
После большого количества времени, потраченного впустую в попытке/уловом, я смог сам найти ответ.
.jython должны выглядеть так:
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
Не это:
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
В частности, добавление /path/to/project/build/classes
к пути импорта неверно (даже если оно отражает иерархию файловой системы), тогда как /path/to/project/build
прав и решила проблему.
Ответ 2
Вам нужно установить CLASSPATH, а также python.path.
В том же макете каталога это работает для меня:
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
Ссылка: Работа с CLASSPATH (Jython Book).