如何在JAR文件中使用Python调用Python脚本?

7 投票
1 回答
5319 浏览
提问于 2025-04-15 21:04

我正在开发一个应用程序,这个程序里混合了很多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.myActionimport 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)
  1. 从类路径中加载脚本,并把它作为字符串放在'script'里
  2. 用exec来执行这个脚本

撰写回答