【问题标题】:How do you invoke a python script inside a jar file using python?如何使用 python 在 jar 文件中调用 python 脚本?
【发布时间】:2011-02-02 19:44:40
【问题描述】:

我正在开发一个散布着一堆 jython 和 java 代码的应用程序。由于程序的性质(使用 wsadmin),我们实际上仅限于 Python 2.1

我们目前有一个包含 java 源代码和 .py 模块的 jar。该代码当前使用 java 调用,但我想删除它以支持将尽可能多的功能迁移到 jython。

我遇到的问题是我想从调用 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"

这两个都失败了。我现在有点茫然不知该如何进行。有什么想法吗?

干杯,

特雷弗

【问题讨论】:

  • scriptNamescriptStr的内容是什么?
  • 在 jar 文件中。当我调用 jython 时,它在类路径上。如果我打印 sys.path 你会在那里看到它。为了彻底,我尝试使用 sys.path.append() 将 jar 直接添加到代码中,但没有任何区别。
  • 查看zipimport (docs.python.org/library/zipimport.html) 和底部的示例。当您写init.py 时,是指__init__.py,对吗?

标签: java python import jar jython


【解决方案1】:

以下对我有用:

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 加载脚本作为“脚本”中的字符串
  2. 用 exec 执行脚本

【讨论】:

  • 这是一个非常好的答案。我希望有一些更简单的东西,但我认为这可能是最好的选择。
  • 你好,你能补充一下我们应该如何运行这个脚本。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2020-09-14
  • 2021-07-23
相关资源
最近更新 更多