java - 无法获取从 Java 执行的 python 的输出
问题描述
我实际上正在做我的毕业设计。我必须使用弹簧靴技术。我必须从使用 html 表单输入的 java 代码运行 python 脚本。我已经准备好了我的三个文件 HTML、java 和 python
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Add Info</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/style.css}"/>
</head>
<body>
<h1>Insert an Info:</h1>
<!--
In Thymeleaf the equivalent of
JSP's ${pageContext.request.contextPath}/edit.html
would be @{/edit.html}
-->
<form th:action="@{/index}" method="get">
<input type="text" th:name="Coord1"/> </br>
<input type="text" th:name="Coord2"/> </br>
<input type="text" th:name="Coord3"/> </br>
<input type="text" th:name="Coord4"/> </br>
<input type="text" th:name="datedeb"/> </br>
<input type="text" th:name="datefin"/> </br>
<input type="submit"/>
</form>
<br/>
<!-- Check if errorMessage is not null and not empty -->
<div th:if="${errorMessage}" th:utext="${errorMessage}"
style="color:red;font-style:italic;">
...
</div>
</body>
</html>
的Java代码:
package com.example.project.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class MainController {
float Coord1;
float Coord2;
public static String s;
@RequestMapping(value="/index",method=RequestMethod.GET)
public void addAObjectForm(@RequestParam("Coord1") float Coord1,@RequestParam("Coord2")
float Coord2,@RequestParam("Coord3") float Coord3, @RequestParam("Coord4")float Coord4,@RequestParam("datedeb")
String datedeb,@RequestParam("datefin") String datefin) throws IOException {
//System.out.println(Coord1);
try
{
String pathPython = "test1.py";
String [] cmd = new String[8];
cmd[0] = "python";
cmd[1] = pathPython;
cmd[2] = "Coord1";
cmd[3] = "Coord2";
cmd[4] = "Coord3";
cmd[5] = "Coord4";
cmd[6] = "datedeb";
cmd[7] = "datefin";
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s=in.readLine()) != null){
System.out.println(s);
System.out.println(Coord1);
}
// BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
}
catch(Exception e){
}
}
}
和python代码:
import sys
import os
def getDataFromJava(arg1=(sys.argv[0]),arg2=(sys.argv[1]),arg3=(sys.argv[2]),arg4=(sys.argv[3]),arg5=(sys.argv[4]),arg6=(sys.argv[5])):
cord1=arg1
cord2=arg2
cord3=arg3
cord4=arg4
datedeb=arg5
datefin=arg6
print(cord1)
print(cord2)
#print(arg3_val)
return cord1,cord2,cord3,cord4,datedeb,datefin
当我试图确保我的 python 脚本返回结果时,我在 java 代码中得到 String 等于 null
请提供任何帮助以获得结果
先感谢您。
解决方案
# append to your current test1.py
import sys
getDataFromJava( \
str(sys.argv[0]), str(sys.argv[1]), str(sys.argv[2]), \
str(sys.argv[3]), str(sys.argv[4]), str(sys.argv[5]))
参考
我是 python 的初学者。我用谷歌搜索找到我认为您的解决方案中缺少的内容。我认为需要调用python函数,并且需要检索shell参数并传递给python函数。
更新 1
根据您的编辑,您已更新函数定义 def getDataFromJava(...):
。您尚未在函数定义下方添加函数调用。 getDataFromJava(...)
我在下面提供了一个可运行的脚本。
import sys
import json
def getDataFromJava(arg1,arg2,arg3,arg4,arg5,arg6):
cord1=arg1
cord2=arg2
cord3=arg3
cord4=arg4
datedeb=arg5
datefin=arg6
return cord1,cord2,cord3,cord4,datedeb,datefin
print(json.dumps(getDataFromJava( \
str(sys.argv[1]), str(sys.argv[2]), str(sys.argv[3]), \
str(sys.argv[4]), str(sys.argv[5]), str(sys.argv[6]))))
$ python test1.py qw er ty ui op as
["qw", "er", "ty", "ui", "op", "as"]
我添加了 json,因为我看到您正在将项目列表返回到 java 端。我认为 json 将是你的 python 端和你的 java 端之间的一个很好的数据交换格式。您的 java 代码现在需要解析返回的 json 格式的字符串。如果您要返回一些项目并希望跳过 json 使用,则可以返回类似abc#def#ghi#jkl
.
print('#'.join(getDataFromJava( \
str(sys.argv[1]), str(sys.argv[2]), str(sys.argv[3]), \
str(sys.argv[4]), str(sys.argv[5]), str(sys.argv[6]))))
推荐阅读
- c# - 为什么我的主窗体需要 20 多秒才能可见?
- c# - 如何计算 Unity3D 中组按钮的自动大小
- c++ - “石头,纸,剪刀” C++ 代码的问题
- javascript - 在 promise API 调用 jest 中测试 then()
- angular - Angular7 - 在处理表单中的无线电控制时处理多个问题时出错
- java - 带有 exceptionExpression 的 @Retryable 不设置任何 #root 对象也不设置变量
- python - 使用Python中的正则表达式查找字符串中以给定子字符串开头和结尾的所有字符串
- javascript - 如何将嵌套的 json 转换为 Javascript 中的对象数组?
- angular - 我的选择框如何选择选项值?
- c++ - 使用嵌套结构初始化联合