【问题标题】:Python: How can I execute a jar file through a python scriptPython:如何通过 python 脚本执行 jar 文件
【发布时间】:2011-11-14 09:57:07
【问题描述】:

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

Execute .jar from Python

How can I get my python (version 2.5) script to run a jar file inside a folder instead of from command line?

How to run Python egg files directly without installing them?

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

import os

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

import subprocess

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

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

你知道我做错了什么吗?或者,是否有任何其他网站可以让我更深入地研究我的问题?

【问题讨论】:

  • 您遇到了什么错误? PATH env var 设置是否正确?
  • 我使用的路径是复制粘贴,所以插入正确。问题是我试图将它插入到 python 中的方法函数中,例如 def blender(): os.system(java -jar Blender.jar) ,并且 IDLE 说:我的方法中的语法无效。
  • 我用不同的方式尝试了它们,使用绝对路径,但总是同样的错误。我正在使用 macOS
  • java -jar Blender 周围没有引号。这只是复制粘贴错误吗?
  • 我插入的路径是复制粘贴,这就是为什么我认为这是正确的。我想你在谈论第二个代码,我应该插入 "" 引号对吗?此外,哪种解决方案是最好的?

标签: java python jar


【解决方案1】:

我会这样使用子流程:

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

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

那么,这正是您遇到的错误? 请在某处发布您从失败执行中获得的所有输出。

【讨论】:

  • IDLE 唯一说的是语法无效。我不太了解正确配置的术语。我应该把它放在别的地方吗?我刚刚从我的工作区复制到我的 python 脚本所在的文件夹。
  • ..它只是说“语法错误”还是也有一些错误跟踪?
  • 我想我发现了无效语法的错误:) 谢谢:)
  • 你的意思是,环境变量? subprocess.call( ... , env={'JAVA_OPTS':' ... '})
  • 要在使用 subprocess.call() 执行 .jar 文件时包含参数,只需将它们附加到以逗号分隔的方法的末尾示例:subprocess.call(['java', '-jar', 'Blender.jar', 'arg1', 'arg2', 'however_many_args_you_need'])
【解决方案2】:

这对我总是有效的:

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

【讨论】:

  • 这给出了jar程序的结果?
  • @bbeudoin:我收到了这个错误(我使用的是 python 3.6.0)——TypeError:endswith first arg must be bytes or a tuple of bytes, not str for the line if line != ' ' 和 line.endswith('\n'):
  • 那么我应该创建一个新的python脚本并用我的java代码将它保存在save文件夹中并运行这个脚本吗?
  • 如何找到“myJarFile.jar”这个文件?除了我的库中的文件之外,我没有找到任何带有“.jar”的文件。
【解决方案3】:

使用 args:使用 Python 中的 Closure Compiler (https://developers.google.com/closure/) 的具体示例

import os
import re
src = test.js
os.execlp("java", 'blablabla', "-jar", './closure_compiler.jar', '--js', src, '--js_output_file',  '{}'.format(re.sub('.js$', '.comp.js', src)))

(另见此处When using os.execlp, why `python` needs `python` as argv[0]

【讨论】:

    【解决方案4】:

    使用 os.system() 怎么样:

    os.system('java -jar blabla...')
    

    os.system(命令) 在子shell 中执行命令(字符串)。这是通过调用标准 C 函数 system() 来实现的,并且具有相同的限制。对sys.stdin等的更改不会反映在执行命令的环境中。

    【讨论】:

      【解决方案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'))
      

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

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 2013-04-17
        • 2018-04-12
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多