如何使用Python在jar文件内调用Python脚本?

7
我正在开发一个应用程序,其中穿插着大量的Jython和Java代码。由于程序使用wsadmin,我们受到Python 2.1的极大限制。
目前,我们有一个包含Java源代码和.py模块的jar文件。该代码目前是通过Java调用的,但我希望尽可能多地将功能迁移到Jython中,以消除Java的依赖。
我的问题是,我想从调用的Jython脚本中导入或执行现有jar文件中的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"

这两个方法都失败了。我有点不知道该怎么继续下去了。有什么想法吗?

谢谢,

Trevor


scriptNamescriptStr的内容是什么? - badp
在jar文件中。当我调用jython时,它在类路径上。如果我打印sys.path,你会看到它在那里。为了彻底,我尝试使用sys.path.append()直接将jar添加到代码中,但没有任何区别。 - Trevor
看一下 zipimport (http://docs.python.org/library/zipimport.html) 并查看底部的示例。当您编写 init.py 时,是指 __init__.py,对吗? - mg.
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执行脚本

那是一个非常好的答案。我希望能有更简单的解决方案,但我认为这很可能是最好的选择。 - Trevor
你好,请问能否添加一下如何运行这个脚本的说明。谢谢。 - Amine CHERIFI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接