Почему Jython отказывается найти мой пакет Java? - программирование
Подтвердить что ты не робот

Почему Jython отказывается найти мой пакет Java?

Я знаю это что-то глупое, но почему-то Jython отказывается найти javax.swing. Я использую Java 1.6.0_11. Это мой запуск script:

@echo off

"%JAVA_HOME%\bin\java" -Xmx1024M -classpath ".;c:\Projects\Jython2.5.1\jython.jar" org.python.util.jython 

Мой вывод выглядит так:

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10
Type "help", "copyright", "credits" or "license" for more information.
>>> import javax.swing
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named swing
>>> import javax
>>> dir(javax)
['__name__']
>>>
4b9b3361

Ответ 1

Скорее всего, Jython не сканирует ваши пакеты. При запуске Jython пытается пройти через банки и файлы классов на своем пути и сканировать пакеты Java. Это необходимо, потому что нет способа поиска пакетов Java путем отражения. Сканирование пакета может быть намеренно отключено, или вам не хватало привилегий для записи, где он хочет записать кэшированную информацию, см. http://wiki.python.org/jython/PackageScanning для получения дополнительной информации. Лучший способ импортировать Java-классы - это сделать явным образом класс за классом, например:

from javax.swing import JFrame

Этот метод всегда должен работать, даже если сканирование пакетов выключено или иным образом не может работать, и является рекомендуемым (хотя это может быть немного утомительно). Если вы хотите импортировать пакеты (или если хотите сделать) из javax.swing import *, которые также зависят от сканирования пакетов, но не рекомендуется), вам нужно будет выяснить, почему сканирование пакетов не работает.

Ответ 2

У меня были аналогичные проблемы, и оказалось, что , поскольку автономный Jython dist не поддерживает кеширование, он также не поддерживает подход "импорт".. Это явно не документировано нигде в официальные документы Jython, но я пришел к выводу, что это основано на нескольких отчетах об ошибках:

Известно из этой последней ссылки:

Итак, как отметил Оти, в автономном режиме вы должны сделать полный импорт для успеха.

Чтобы исправить вашу проблему, используйте нестандартный стандарт jython.jar, сгенерированный при установке jython с использованием опции "Стандарт".

Если вы хотите упаковать и распространять jython.jar с вашим приложением, в случае, если у пользователя нет установленного Jython, вам также понадобится скопировать/распаковать полную папку "Lib" из каталога установки jython в любое место вы заканчиваете размещение jython.jar. Это позволяет получить доступ к stdlib python, который не включен в стандартный файл jar.

UPDATE: После игры больше, я думаю, что у меня есть исправление, позволяющее импортировать импорт типа "импорт" даже при использовании автономной банки. Все, что нужно сделать, это включить кеширование!

Вы можете сделать это, добавив следующие параметры jvm при запуске jython:

-Dpython.cachedir.skip = false -Dpython.cachedir = ЖЕЛАЕМЫЙ ПУТЬ CACHE

(Обратите внимание, что второй аргумент является необязательным, и если он оставлен пустым, будет использоваться значение по умолчанию)

Если у вас возникла проблема с запуском InteractiveConsole, встроенным в приложение (это моя проблема), вы можете добавить эти свойства до инициализации консоли:

    Properties props = new Properties();
    props.put("python.cachedir.skip", "false");
    props.put("python.cachedir", "DESIRED CACHE PATH"); // again, this option is optional
    InteractiveConsole.initialize(System.getProperties(), props, new String[0]);

Ответ 3

Я использую Java 1.6.0_11

Нет, вы используете

[виртуальная машина клиента Java HotSpot ™ (Sun Microsystems Inc.)] на java1.6.0_10

Что произойдет, если вы удалите кешир из каталога распространения Jython и повторите попытку?

Кроме того, почему вы явно устанавливаете путь к классам таким образом? Почему не просто

java -jar jython.jar

?