【问题标题】:Unable to get the output of python executed from Java无法获取从 Java 执行的 python 的输出
【发布时间】:2021-09-22 22:14:18
【问题描述】:

我实际上正在做我的毕业设计。我必须使用弹簧靴技术。我必须从使用 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 s 等于 null

任何帮助请得到结果

提前谢谢你。

【问题讨论】:

  • 先见this。然后发布任何错误

标签: java python html spring spring-boot


【解决方案1】:
# 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]))

Ref
我是python的初学者。我用谷歌搜索找到我认为您的解决方案中缺少的内容。我觉得需要调用python函数,需要取回shell参数传入python函数。

更新 1

根据您的编辑,您更新了函数定义 def getDataFromJava(...):。您尚未在函数定义下方添加函数 call 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]))))

【讨论】:

  • Import sys 从一开始就在那里。我修改了你提到的 getDataFromJava 函数,但是当我在 = new BufferedReader(new InputStreamReader(p.getInputStream())); 中运行 BufferedReader 时,我仍然得到 null while((s=in.readLine()) != null){ System.out.println(s); System.out.println(Coord1); }
  • 对于不使用python的人,请将该脚本更改为可以在python中运行并打印到stdout(最好也是stderr)同时重现您的问题
  • 好的,我现在已经让你的脚本可以测试了。您的代码为我运行,因此查找您的问题的第一个地方是脚本的路径。试着让它从一开始就完整而绝对。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多