Как вы вызываете скрипт Python внутри файла JAR, используя Python? - PullRequest
7 голосов
/ 31 марта 2010

Я работаю над приложением, которое перемежает кучу jython и java-кода. Из-за характера программы (использующей wsadmin) мы действительно ограничены Python 2.1

В настоящее время у нас есть jar-файл, содержащий как java source, так и .py модули. Код в настоящее время вызывается с использованием java, но я бы хотел убрать это, чтобы перенести как можно больше функциональных возможностей на jython.

Проблема, с которой я столкнулся, заключается в том, что я хочу импортировать или выполнять модули python внутри существующего jar-файла из вызывающего jython-скрипта. Я попробовал несколько разных способов без успеха.

Моя структура каталогов выглядит так:

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

Первый подход, который я попробовал, заключался в импорте из банки. Я добавил jar в sys.path и попытался импортировать модуль, используя import com.example.action.myAction и import myAction . Однако безуспешно, даже когда я помещаю init .py файлы в каталог на каждом уровне.

Второй подход, который я попробовал, состоял в том, чтобы загрузить ресурс, используя класс java. Поэтому я написал следующий код:

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"

Оба из них не удалось. Я сейчас немного растерялся относительно того, как мне поступить. Есть идеи?

ура

Тревор

1 Ответ

5 голосов
/ 31 марта 2010

у меня работает следующее:

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. Загрузка скрипта из ClassPath в виде строки в 'script'
  2. exec скрипт с exec
...