如何在JAR文件中使用Python调用Python脚本?
我正在开发一个应用程序,这个程序里混合了很多jython和java代码。由于这个程序的特性(使用wsadmin),我们只能使用Python 2.1。
目前我们有一个jar文件,里面包含了java源代码和.py模块。现在代码是通过java来调用的,但我想尽量把功能迁移到jython上,去掉java的部分。
我遇到的问题是,我想在现有的jar文件中,从一个调用的jython脚本里导入或执行python模块。我尝试了几种不同的方法,但都没有成功。
我的目录结构是这样的:
application.jar
|-- com
|--example
|-- action
|-- MyAction.class
|-- pre_myAction.py
我尝试的第一个方法是从jar文件中导入模块。我把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
以下方法对我有效:
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)
- 从类路径中加载脚本,并把它作为字符串放在'script'里
- 用exec来执行这个脚本