【问题标题】:Python - Execute Java - Could not find or load main class [duplicate]Python - 执行 Java - 找不到或加载主类 [重复]
【发布时间】:2018-11-02 20:08:05
【问题描述】:

我跟着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 sn -p触发)works

【问题讨论】:

  • 你试过execute_java('model.classification.Model', '5 6 7 8')吗(可能需要去掉splitext的使用!)?

标签: java python


【解决方案1】:

问题似乎是,您必须将*.class 文件的目录添加到类路径!您在目录model/classification 中编译了类,因此您的*.class 文件的路径是model/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脚本的执行目录的!

【讨论】:

  • 我很快就猜到问题是该类是model.classification.Model(所以Model在包model.classification中),而不是Model(或Model.java,因为你的代码尝试) 在model/classification 文件夹中。
  • @MarkRotteveel 好吧,这也是这个问题的一个可能来源......
  • @MarkRotteveel 但是他在子目录中编译了类,没有将目录添加到类路径,所以我认为问题是缺少目录而不是任何包问题......
  • 不,javac 可以编译(假设它不引用该包中的其他文件),但 java 不能那样执行。
猜你喜欢
  • 2014-09-10
  • 2016-12-17
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2022-06-13
  • 2013-01-17
相关资源
最近更新 更多