首页 > 解决方案 > 无法获取从 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

请提供任何帮助以获得结果

先感谢您。

标签: javapythonhtmlspringspring-boot

解决方案


# 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]))))

推荐阅读