java - 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 片段触发)有效。
解决方案
问题似乎是,您必须将*.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 脚本的执行目录的!
推荐阅读
- docker - OAuth2 Proxy 真实客户端 IP
- javascript - 如何从嵌入式谷歌应用脚本导航(链接)到不同的谷歌网站?将导航栏嵌入谷歌网站
- python - 如何在相同索引处找到两个列表的最大值
- amazon-web-services - 将 Apache 超集与 openSearch 连接的最佳方式(AWS 托管 elasticSearch)
- python - python dash框架中的回调问题。由于某种原因,回调不处理
- javascript - 如果角色更改机器人显示昵称已更新,如何解决
- apache-kafka - 如何在 Kafka 2.5.0 中降级 log.message.format.version
- vue.js - Vue-Filepond & Nuxt-Bridge
- javascript - 如何找到字符串的相似元素
- angular - 使用单独开发时如何从Angular2中的后端获取令牌?