2009-11-05 12 views
12

Sé que es algo tonto, pero por alguna razón Jython se niega a encontrar javax.swing. Estoy usando Java 1.6.0_11. Este es mi script de arranque:¿Por qué Jython se niega a encontrar mi paquete de Java?

@echo off 

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

Mi salida será similar a:

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__'] 
>>> 
+3

Esta es una pregunta/problema muy común. Cualquier posibilidad de que cambie el título a "¿Por qué Jython se niega a encontrar mi paquete de Java?" de esa manera, más personas probablemente encontrarán esto. –

+0

Cambié el nombre - tienes razón, esto le puede pasar a cualquiera. – MikeHoss

+0

¡Gracias por cambiar el nombre! –

Respuesta

12

Lo más probable es que Jython no esté escaneando sus paquetes. Al inicio, Jython intenta examinar los archivos jars y class en su ruta y buscar paquetes Java. Esto es necesario porque no hay forma de buscar paquetes Java por reflexión. El escaneo del paquete puede ser apagado deliberadamente, o puede carecer de privilegios de escritura donde quiera escribir la información almacenada en caché, vea http://wiki.python.org/jython/PackageScanning para obtener más información. La mejor manera de importar clases de Java es hacerlo de forma explícita una clase por otra, así:

from javax.swing import JFrame 

Este método debe trabajar siempre, incluso si la exploración paquete está apagado o no puede trabajar, y es el método recomendado (aunque puede ser un poco tedioso). Si desea importar paquetes (o si desea hacer "desde javax.swing import *", que también depende del escaneo del paquete, pero no se recomienda), deberá averiguar por qué el escaneo de su paquete no funciona.

+0

El objeto "desde el objeto de importación del paquete" funcionó. Descubriré por qué el escaneo del paquete no funciona, pero al menos tengo algo que hacer. Gracias Frank! ¡Mantener el buen trabajo! – MikeHoss

1

estoy usando Java 1.6.0_11

No, estás usando

[Java HotSpot (TM) Client VM (Sun Microsystems Inc.)] en java1.6.0_10

Lo que sucede si se elimina el cachedir desde el directorio de distribución de Jython, y vuelve a intentarlo?

Además, ¿por qué establece explícitamente el classpath de esa manera? ¿Por qué no simplemente

java -jar jython.jar 

?

+0

Estoy usando el jar Jython independiente, que no hace el almacenamiento en caché. Y no puedo ejecutar esto desde -jar porque eventualmente comenzaré a agregar otros archivos jar al classpath. – MikeHoss

+0

puede habilitar el almacenamiento en caché incluso cuando utiliza el contenedor independiente. Ver mi respuesta en este hilo. – Mikeyg36

11

Tuve problemas similares, y resulta que ya que el dist independiente de Jython no admite el almacenamiento en caché, tampoco admite el enfoque "importar *". Esto no está claramente documentada en cualquier parte de los documentos oficiales Jython, pero llegó a la conclusión esta basada en un número de diferentes informes de errores:

Notable de ese último enlace:

Por lo tanto, como señaló Oti, en la versión independiente debe hacer importaciones completas para tener éxito.

Para solucionar su problema, utilice el jython estándar no independiente.jar generado al instalar jython usando la opción 'Estándar'.

Si desea empaquetar y distribuir jython.jar con su aplicación, en caso de que un usuario no tenga Jython instalado, entonces también deberá copiar/pasar la carpeta completa "Lib" del directorio de instalación de jython al que sea ubicación donde termina colocando jython.jar. Esto permite el acceso a python stdlib que no está incluido en el archivo jar estándar.

ACTUALIZACIÓN: Después de jugar más, creo que tengo una solución para permitir la "importación *" importaciones Tipo incluso cuando se utiliza el frasco independiente. ¡Todo lo que se necesita hacer es habilitar el almacenamiento en caché!

Puede hacerlo por cualquiera de las siguientes opciones de añadir a la JVM cuando se ejecuta jython:

-Dpython.cachedir.skip = falsa -Dpython.cachedir = CACHE DESEADO PATH

(Tenga en cuenta que el segundo argumento es opcional, y si se deja en blanco, se usará un valor predeterminado)

Si tiene un problema al ejecutar InteractiveConsole incrustado en una aplicación (que es w Si mi problema era) puede agregar estas propiedades antes de inicializar la consola:

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]); 
+0

¿Hay alguna forma de modificar el jar independiente para que python.cachedir.skip se establezca como falso de forma predeterminada? – Kyle

Cuestiones relacionadas