Java使用Jython调用Python脚本时如何传递参数
解决方案
核心实现逻辑:要达到和main.py arg1等效的命令行传参效果,只需要在执行目标Python脚本前,通过Jython引擎配置Python内置的sys.argv参数列表即可,sys.argv的结构和命令行执行时完全一致,第一个元素为脚本名称,后续元素为按顺序传入的参数。
修改后的Java代码
public static void pyCode(String argumentOne) throws FileNotFoundException, ScriptException { StringWriter writer = new StringWriter(); //输出结果将存储在这里 ScriptEngineManager manager = new ScriptEngineManager(); ScriptContext context = new SimpleScriptContext(); context.setWriter(writer); //配置输出重定向 ScriptEngine engine = manager.getEngineByName("python"); // 新增传参逻辑 engine.put("inputArg", argumentOne); // 初始化sys.argv,结构和命令行执行规则保持一致 engine.eval("import sys\nsys.argv = ['main.py', inputArg]", context); engine.eval(new FileReader("main.py"), context); System.out.println(writer.toString()); }
Python脚本(main.py)调用示例
脚本内读取参数的方式和普通命令行传参完全一致:
import sys # sys.argv[0]固定为脚本名,第一个参数从sys.argv[1]开始读取 received_arg = sys.argv[1] print(f"接收到Java传入的参数:{received_arg}")
补充说明
- 若需要传递多个参数,只需向
sys.argv列表追加元素即可,例如sys.argv = ['main.py', arg1, arg2, arg3]对应命令行执行效果main.py arg1 arg2 arg3 - 采用
engine.put传递参数的方式无需额外处理特殊字符转义,比字符串拼接参数的方式更安全,可避免脚本注入风险 - 若传递非字符串类型的参数(比如数字、自定义Java对象),Jython会自动完成类型适配,Python侧可以直接读取使用
内容的提问来源于stack exchange,提问作者mikegr3p
相关产品推荐
相关产品推荐

