关于Python:Python-执行Java-无法找到或加载主类

Python - Execute Java - Could not find or load main class

本问题已经有最佳答案,请猛点这里访问。

我按照SO Answer来从python执行Java程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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代码段触发的编译版本)是可行的。


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

此python代码对我有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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脚本的执行目录!