2010-03-31 24 views
6

Estoy trabajando en una aplicación que intercala un montón de código jython y java. Debido a la naturaleza del programa (usando wsadmin) estamos realmente restringidos a Python 2.1¿Cómo se invoca una secuencia de comandos python dentro de un archivo jar utilizando Python?

Actualmente tenemos un contenedor que contiene ambos módulos java source y .py. El código se invoca actualmente usando java, pero me gustaría eliminar esto a favor de migrar la mayor funcionalidad posible a jython.

El problema que tengo es que quiero importar o ejecutar módulos de python dentro del archivo jar existente desde una secuencia de comandos jython de llamada. Intenté un par de formas diferentes sin éxito.

Mi estructura de directorios se parece a:

application.jar 
    |-- com 
     |--example 
      |-- action 
       |-- MyAction.class 
       |-- pre_myAction.py 

La primera aproximación que intenté fue hacer las importaciones de la jarra. Agregué el jar a mi sys.path e intenté importar el módulo usando import com.example.action.myAction y import myAction. Sin embargo, no tuve éxito, incluso cuando puse init .py archivos en el directorio en cada nivel.

El segundo método que probé fue cargar el recurso usando la clase java. Así que escribí el siguiente código:

import sys 
import os 
import com.example.action.MyAction as MyAction 

scriptName = str(MyAction.getResource('/com/example/action/myAction.py')) 
scriptStr = MyAction.getResourceAsStream('/com/example/action/myAction.py') 

try: 
    print execfile(scriptStr) 
except: 
    print "failed 1" 

try: 
    print execfile(scriptName) 
except: 
    print "failed 2" 

Ambos fallaron. Ahora estoy un poco perdido en cuanto a cómo debo proceder. Algunas ideas ?

aplausos,

Trevor

+0

cuáles son el contenido de 'scriptName' y' scriptStr'? – badp

+0

En el archivo jar. Está en el classpath cuando invoco a jython. Si imprimo sys.path lo ves allí. Para ser minucioso, intenté agregar el jar directamente al código usando sys.path.append() pero no hizo ninguna diferencia. – Trevor

+0

Mira 'zipimport' (http://docs.python.org/library/zipimport.html) y en el ejemplo en la parte inferior. Cuando escribes 'init.py', quieres decir' __init __. Py', ¿verdad? –

Respuesta

5

las siguientes obras para mí:

import sys 
import os 

import java.lang.ClassLoader 
import java.io.InputStreamReader 
import java.io.BufferedReader 

loader = java.lang.ClassLoader.getSystemClassLoader() 
stream = loader.getResourceAsStream("com/example/action/myAction.py") 
reader = java.io.BufferedReader(java.io.InputStreamReader(stream)) 

script = ""       
line = reader.readLine() 
while (line != None) : 
    script += line + "\n" 
    line = reader.readLine() 

exec(script) 
  1. Carga del script en la ruta de clase como una cadena en 'guión'
  2. ejecutivo de la secuencia de comandos con ejecutivo
+0

Esa es una muy buena respuesta. Esperaba algo un poco más simple, pero creo que esta es probablemente la mejor opción. – Trevor

+0

hola, podría agregar cómo deberíamos ejecutar este script. Gracias –

Cuestiones relacionadas