Utilizando clases de Java personalizadas con JPYPE: Error de paquete no conlleva
Pregunta
Estoy tratando de obtener un ejemplo muy simple de usar JPYPE (versión: 0.5.4.6) Para instanciar una clase de Java personalizada desde Python. Eso Sigue libremente un ejemplo: http://hustlevlay.wordpress.com/2010/02/120/2010/02/18/JPYPE -tutorial / y es relacionado con: dolores de cabeza JPYPE
Aquí está el código Python (en /users/me/jpypyest/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()
y aquí está el código Java (en /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);
}
}
compilado usando:
javac Test.java
para producir /users/me/jpypetest/pkg/test.class sin errores (También he intentado poner test.class en el directorio de trabajo)
Ejecutar el código Python da:
> 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
El sistema es un Mac que ejecuta Mavericks con:
> 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)
Un método JPYPE para listar las clases de Java importadas también sería muy útil
Muchas gracias por mirar esto!
Solución
El problema parece ser que acceder a un atributo de una clase JPackage devuelve una clase JPackage cuando lo que realmente quiere es un JClass.Cambiando el testjpype.py para ser esto funcionado para mí:
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()