использование пользовательских классов Java с JPype: пакет не вызывается ошибка

Я пытаюсь получить очень простой пример использования JPype (версия: 0.5.4.6) для создания экземпляра пользовательского класса Java из Python. Он примерно соответствует примеру: http://hustleplay.wordpress.com/2010/02/18/jpype-tutorial/ и связано с: головными болями JPype

вот код Python (в /Users/me/jpypeTest/testjpype.py):

from jpype import *
cpopt="-Djava.class.path=%s" % ("/Users/me/jpypeTest")
startJVM(getDefaultJVMPath(),"-ea",cpopt)
print "JVM path:",getDefaultJVMPath()
print "classpath:",cpopt
java.lang.System.out.println("Hello World!!")
testPkg = JPackage('pkg')
Test = testPkg.Test
Test.speak("hi")
shutdownJVM()

и вот код Java (в /Users/me/jpypeTest/pkg/Test.java):

package pkg;
public class Test {
    private String msg;

    public Test() {
        msg = "nothing so far...";
    }

    public static void speak(String msg) {
        System.out.println(msg);
    }
}

скомпилировано с использованием:

javac Test.java

для создания /Users/me/jpypeTest/pkg/Test.class без ошибок (я также пытался поместить Test.class в рабочий каталог)

запуск кода Python дает:

> python testjpype.py 
JVM path: /System/Library/Frameworks/JavaVM.framework/JavaVM
classpath: -Djava.class.path=/Users/me/jpypeTest
Hello World!!
Traceback (most recent call last):
  File "testjpype.py", line 9, in <module>
    Test.speak("hi")
  File "/Users/me/dev/lib/python2.7/site-packages/jpype/_jpackage.py", line 53, in __call__
    raise TypeError, "Package "+self.__name+" is not Callable"
TypeError: Package pkg.Test.speak is not Callable

Система — это Mac, на котором работает Mavericks с:

> java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

> javac -version
javac 1.7.0_45

> python --version
Python 2.7.5

> python -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)

Метод JPype для перечисления импортированных классов Java также был бы очень полезен.

Большое спасибо, что посмотрели это!


person Ziggy Eunicien    schedule 08.01.2014    source источник
comment
Вы получили решение этого?   -  person Sankalp    schedule 22.01.2017
comment
Боюсь, что нет, давно заброшен   -  person Ziggy Eunicien    schedule 24.01.2017


Ответы (1)


Проблема заключается в том, что доступ к атрибуту класса JPackage возвращает класс JPackage, когда вам действительно нужен JClass. Изменение testjpype.py на это сработало для меня:

from jpype import *
cpopt="-Djava.class.path=%s" % ("/Users/me/jpypeTest")
startJVM(getDefaultJVMPath(),"-ea",cpopt)
java.lang.System.out.println("Hello World!!")
Test = JClass('pkg.Test')
Test.speak("hi")
shutdownJVM()
person Brian McMaster    schedule 06.11.2017
comment
оценил. Я больше не могу подтвердить, потому что прошло слишком много времени с тех пор, как я задал первоначальный вопрос. - person Ziggy Eunicien; 09.11.2017