Python调用Java程序:如何向Java main方法传递命令行参数?
解决Python调用Java程序时参数无法传入main方法args数组的问题
嘿,我明白你遇到的问题了——用Python的subprocess调用Java程序时,明明传了5 5 5 5 5 5 5,但Java main方法里的String[] args还是空的,直接在控制台跑却正常。这其实是因为你传递参数的方式错了!
问题根源
你现在是通过process.communicate(stdin)把参数塞进了Java程序的标准输入流(stdin),但Java的main方法的args数组是用来接收命令行参数的,也就是你在控制台敲java Model 5 5 ...时,跟在类名后面的那些内容。这俩完全不是一个东西,所以Java程序自然拿不到参数。
修正方案
把参数直接作为命令行参数追加到Java的执行命令里,和你手动在控制台执行的逻辑保持一致就行。这里给你修改好的代码:
import os.path import subprocess from subprocess import STDOUT, PIPE def compile_java(java_file): subprocess.check_call(['javac', java_file]) def execute_java(java_class, args_list): # 把命令行参数直接加到Java命令的参数列表中 cmd = ['java', '-cp', 'model/classification', java_class] + args_list process = subprocess.Popen(cmd, stdout=PIPE, stderr=STDOUT, universal_newlines=True) stdout, stderr = process.communicate() return stdout # 编译目标Java文件 compile_java(os.path.join('model', 'classification', 'Model.java')) # 传递拆分好的参数列表,或者用字符串split()拆分更方便 output = execute_java('Model', '5 5 5 5 5 5 5'.split()) print(output)
额外说明
- 如果你的参数本来就是列表形式(比如
['5','5',...]),直接传进去就行;如果是空格分隔的字符串,用split()方法一键拆分非常省事。 - 要是你确实需要让Java程序从标准输入读取内容,那得在Java代码里加读取逻辑(比如用
Scanner(System.in)),但根据你的需求,显然是要让参数进入args数组,所以上面的方案完全适配你的场景。
内容的提问来源于stack exchange,提问作者d4rty
相关产品推荐
相关产品推荐

