首页 > 解决方案 > Python - 执行 Java - 找不到或加载主类

问题描述

我按照SO Answer从 python 执行 java 程序

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


def compile_java(java_file):
    subprocess.check_call(['javac', java_file])


def execute_java(java_file, stdin):
    java_class, ext = os.path.splitext(java_file)
    cmd = ['java', java_class]
    process = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT, universal_newlines=True)
    stdout, stderr = process.communicate(stdin)
    print(stdout)


compile_java(os.path.join('model', 'classification', 'Model.java'))
execute_java('Model', '5 6 7 8')

python代码编译/model/classification/Model.java没有问题。但是当python代码执行java程序时,java找不到或者加载主类Model。在同一目录中的命令行中执行java Model(使用编译版本,由上面的 python 片段触发)有效

标签: javapython

解决方案


问题似乎是,您必须将*.class文件的目录添加到类路径中!您在目录中编译了类,model/classification因此文件的路径*.classmodel/classification/Model.class. 要执行此字节码,您需要通过编写将目录添加到类路径java -cp model/classification Model...

这个python代码对我有用:

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

def compile_java(java_file):
    subprocess.check_call(['javac', java_file])

def execute_java(java_file, stdin):
    java_class,ext = os.path.splitext(java_file)

    // I changed the following line by adding the directory to the classpath
    cmd = ['java', '-cp', 'model/classification', java_class]

    proc = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout,stderr = proc.communicate(stdin)
    print ('This was "' + stdout + '"')

compile_java(os.path.join('model', 'classification', 'Model.java'))
execute_java('Model.java', '5 6 7 8')

在这种情况下,目录路径是相对于你的 python 脚本的执行目录的!


推荐阅读