Python:如何通过Python脚本执行jar文件

49 投票
5 回答
132679 浏览
提问于 2025-04-17 01:58

我一直在寻找如何通过Python执行一个Java的jar文件的方法。在查看了以下内容后:

从Python执行.jar文件

如何让我的Python(2.5版)脚本在文件夹中运行jar文件,而不是从命令行运行?

如何直接运行Python的egg文件而不安装它们?

我尝试了以下方法(我的jar文件和Python文件在同一个目录下):

import os

if __name__ == "__main__":
    os.system("java -jar Blender.jar")

还有

import subprocess

subprocess.call(['(path)Blender.jar'])

但都没有成功。所以,我在想我应该使用Jython,但我觉得通过Python执行jar文件应该有更简单的方法。

你知道我可能哪里做错了吗?或者,有没有其他网站可以让我更深入地了解我的问题?

5 个回答

5

我用以下方法来运行tika这个程序,提取一个Word文档的内容。这个方法有效,我也得到了输出。我要运行的命令是 "java -jar tika-app-1.24.1.jar -t 42250_EN_Upload.docx"

from subprocess import PIPE, Popen
process = Popen(['java', '-jar', 'tika-app-1.24.1.jar', '-t', '42250_EN_Upload.docx'], stdout=PIPE, stderr=PIPE)
result = process.communicate()
print(result[0].decode('utf-8'))

这里我得到了一个元组的结果,所以用 "result[0]" 来获取第一个值。此外,得到的字符串是二进制格式(b-string)。要把它转换成普通字符串,我们需要用'utf-8'来解码。

16

这个方法对我来说总是有效:

from subprocess import *

def jarWrapper(*args):
    process = Popen(['java', '-jar']+list(args), stdout=PIPE, stderr=PIPE)
    ret = []
    while process.poll() is None:
        line = process.stdout.readline()
        if line != '' and line.endswith('\n'):
            ret.append(line[:-1])
    stdout, stderr = process.communicate()
    ret += stdout.split('\n')
    if stderr != '':
        ret += stderr.split('\n')
    ret.remove('')
    return ret

args = ['myJarFile.jar', 'arg1', 'arg2', 'argN'] # Any number of args to be passed to the jar file

result = jarWrapper(*args)

print result
70

我会这样使用子进程:

import subprocess
subprocess.call(['java', '-jar', 'Blender.jar'])

不过,如果你正确配置了 /proc/sys/fs/binfmt_misc/jar,那么你应该可以直接运行这个 jar 文件,就像你写的那样。

那么,你具体遇到了什么错误呢?请把你执行失败时的所有输出信息发到某个地方。

撰写回答