java - 使用外部 jar 和多个 args 从 python 执行 java 类

标签 java python linux python-3.x

我正在尝试构建脚本以通过传递数据样本并从 java 获取结果来执行 java 类。 Java 代码使用外部 jar,它已经在我的 python 文件和 java 文件的相同路径中

我的 python 脚本:

import os.path,subprocess
from subprocess import STDOUT,PIPE

def compile_java(java_file):
    subprocess.check_call(['javac', '-cp', 'commons-codec-1.7.jar', java_file])

def execute_java(java_file,args):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', '-cp', 'commons-codec-1.7.jar', java_class]
    proc = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout,stderr = proc.communicate(args)
    print(stdout)
compile_java('jf.java')
execute_java('jf.java',[1,2])

我的 java 类示例:

import org.apache.commons.codec.binary.Base64;
public class jf {

    public static void main(String[] args) {

        System.out.println(args[0]);

    }
}

但是我在编译时遇到了错误:

b'Error: Could not find or load main class jf\n'

我认为问题在于将 args 传递给 main 函数,当 main 函数是 void 函数时,我如何从 java 返回值?

最佳答案

您通过-cp 参数指定java 的类路径。 Java 将在给定文件中查找 jf 类,但找不到:

> java -cp commons-codec-1.7.jar jf toot
Error: Could not find or load main class jf

这里你真的不需要commons-codec。你可以直接使用类名:

> java jf toot
toot

如果您的实际代码需要额外的 jar,或者将 . 添加到您的类路径中:

> java -cp commons-codec-1.7.jar;. jf toot
toot

在你的 python 中:

cmd = ['java', '-cp', 'commons-codec-1.7.jar;.', java_class]

另外一点:因为你需要传递参数,我不会使用 proc.communicate 因为它在标准输入上发送数据(你需要在 java 端使用类似扫描仪的东西) ,但只需将 args 附加到您的 cmd 数组:

cmd = ['java', '-cp', 'commons-codec-1.7.jar;.', java_class] + args

关于java - 使用外部 jar 和多个 args 从 python 执行 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56257549/

相关文章:

linux - 单声道 : Is it possible to host a web/wcf service from console application?

linux - Qt.QPluginLoader。如何使应用程序对插件崩溃不敏感?

Java 套接字 API : How to tell if a connection has been closed?

java - 为什么我的数组元素不能被正确解析?

Java:从 ArrayList 获取子列表的有效方法

c - 为什么当被跟踪者收到 SIGCONT 时会发生 SIGTRAP PTRACE_EVENT_STOP?

java - 如何更改 OAuth2ClientAuthenticationProcessingFilter 的 successHandler?

python - 使用Python正则表达式替换字符串中的多个变量值

python - 使用 py2app 创建的 Python Mac 应用程序找不到 cvs 命令

python - 使用 numpy 数组计算累积最小值