2010-03-31 11 views
6

Je travaille sur une application qui intercale un tas de code jython et java. En raison de la nature du programme (en utilisant wsadmin) nous sommes vraiment limités à Python 2.1Comment appeler un script python dans un fichier jar en utilisant python?

Nous avons actuellement un jar contenant à la fois des sources java et des modules .py. Le code est actuellement invoqué en utilisant java, mais je voudrais supprimer ceci en faveur de la migration de toutes les fonctionnalités possibles vers jython. Le problème que j'ai est que je veux soit importer ou exécuter des modules python dans le fichier jar existant à partir d'un script jython appelant. J'ai essayé plusieurs façons différentes sans succès.

Ma structure de répertoire ressemble:

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

La 1ère approche que j'ai essayé était de faire les importations en provenance du pot. J'ai ajouté le jar à mon sys.path et essayé d'importer le module en utilisant à la fois importer com.example.action.myAction et importer myAction. Pas de succès cependant, même lorsque je mets init fichiers .py dans le répertoire à chaque niveau.

La deuxième approche que j'ai essayé était de charger la ressource en utilisant la classe java. J'ai donc écrit le code ci-dessous:

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" 

Les deux ont échoué. Je suis un peu perdu maintenant quant à la façon dont je devrais procéder. Des idées ?

acclamations,

Trevor

+0

quoi de neuf le contenu de 'scriptName' et' scriptStr'? – badp

+0

Dans le fichier jar. C'est sur le classpath quand j'invoque Jython. Si j'imprime sys.path, vous le voyez ici. Juste pour être complet, j'ai essayé d'ajouter le pot directement au code en utilisant sys.path.append() mais cela ne faisait aucune différence. – Trevor

+0

Regardez 'zipimport' (http://docs.python.org/library/zipimport.html) et à l'exemple en bas. Lorsque vous écrivez 'init.py', voulez-vous dire' __init __. Py', n'est-ce pas? –

Répondre

5

les œuvres suivantes pour moi:

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. Chargement du script de la ClassPath en tant que chaîne dans 'script'
  2. exec le script avec exec
+0

C'est une très bonne réponse. J'espérais quelque chose d'un peu plus simple, mais je pense que c'est probablement la meilleure option. – Trevor

+0

bonjour, pourriez-vous s'il vous plaît ajouter comment devrions-nous exécuter ce script. Je vous remercie –

Questions connexes