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

Dim*_*cha 33 python java jar

我一直在寻找如何通过python执行java jar文件的答案,然后查看:

从Python执行.jar

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

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

我尝试执行以下操作(我的jar和python文件都在同一目录中):

import os

if __name__ == "__main__":
    os.system("java -jar Blender.jar")
Run Code Online (Sandbox Code Playgroud)

import subprocess

subprocess.call(['(path)Blender.jar'])
Run Code Online (Sandbox Code Playgroud)

两者都没有奏效.所以,我认为我应该使用Jython,但我认为必须有一种更简单的方法来通过python执行jar文件.

你知道我可能做错了什么吗?或者,是否有其他网站我更多地研究我的问题?

red*_*dow 54

我会这样使用子进程:

import subprocess
subprocess.call(['java', '-jar', 'Blender.jar'])
Run Code Online (Sandbox Code Playgroud)

但是,如果你有一个正确的配置,/proc/sys/fs/binfmt_misc/jar你应该能够直接运行jar,就像你写的那样.

那么,这正是你得到的错误?请将执行失败的所有输出发布到某处.

  • 在使用subprocess.call()执行.jar文件时包含参数,只需将它们附加到以逗号为例的方法的末尾:`subprocess.call(['java',' - jar','Blender.jar' ,'arg1','arg2','but_many_args_you_need'])` (5认同)

小智 10

这对我来说总是有用的:

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
Run Code Online (Sandbox Code Playgroud)

  • @bbeaudoin:我收到此错误(我使用的是 python 3.6.0)--TypeError:endswith 第一个 arg 必须是字节或字节元组,如果 line != '' 和 line.endswith('\ n'): (3认同)

Har*_*ddy 5

我使用以下方式执行tika jar来提取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'))
Run Code Online (Sandbox Code Playgroud)

在这里我得到的结果是元组,因此"result[0]". 该字符串也是二进制格式(b 字符串)。要将其转换为普通字符串,我们需要使用“utf-8”进行解码。