【问题标题】:Calling python script from java web application with Processbuilder使用 Processbuilder 从 Java Web 应用程序调用 python 脚本
【发布时间】:2019-09-11 20:59:41
【问题描述】:

我正在开发一个简单的气象站 - 我想使用 raspberry pi 3b+ 作为主机、dht22 传感器并用 Java(使用 spring boot,然后将其部署到 tomcat 8)和 Python 编写一个 Web 应用程序来检索传感器的数据. 到目前为止我做了什么:

用于检索和显示数据的 Python 应用程序。按预期工作,它只打印类似“22.5;37.4”的内容:

import Adafruit_DHT

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)

if humidity is not None and temperature is not None:
    print("{0:0.1f};{1:0.1f}".format(temperature, humidity))
else:
    print("FAIL")

然后我编写了一个 java 应用程序,将它放入 .jar 并检查我是否能够获取传感器的数据。不是火箭科学,当我在树莓派上使用 java -jar InputTest.jar 时也能按预期工作:

public static void main(String[] args) {
    try {
        ProcessBuilder pb = new ProcessBuilder("python", "/home/pi/Desktop/input/dht_once.py");
        Process process = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("measured: " + line);
        }
        process.waitFor(); 
    } catch (IOException ) {
        System.out.println(" exception " + e.getLocalizedMessage());
    }
}

然后我创建了一个spring boot应用程序,把我的java代码放进去(逻辑同上),打包成一个war,部署到tomcat 8并运行它。结果没有打印任何东西(当然我已经将代码更改为将输出记录到日志文件,它工作正常,我可以看到里面的其他日志)。日志中没有问题,看起来阅读器从不返回一行。
我相信应用程序不会等待进程产生输出,但我不知道为什么。重要的是:产生传感器的输出最多需要几秒钟。我还更改了 python 脚本只是为了测试目的立即返回值:

print("22.4;33.0")

它会导致 java web 应用程序成功读取。但是当它必须等待几秒钟的输出时,它会杀死进程(process.isAlive() 在 while 循环之后是假的)。 我还尝试在当前线程上使用 sleep() 来强制它等待 python 进程但没有成功。

你们知道这种行为的原因是什么吗?还有什么我应该检查的吗?

TLDR;
创建 python 进程的 Java 应用程序工作正常,直到我将它作为 Web 应用程序运行 - 然后看起来它不等待进程的输出

【问题讨论】:

    标签: java python spring spring-boot tomcat


    【解决方案1】:

    我还没有找到解决方案,但是我已经实施了解决方法/更清洁的解决方案。 我决定完全分离 java 和 python 代码并创建用于数据检索的微服务。我使用flask作为rest webservice(遵循本教程https://docs.dataplicity.com/docs/control-gpios-using-rest-api)并直接从java调用它。
    由于这不能解决我最初的问题,因此我不会将其标记为答案,但它可能会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2017-11-18
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多