gpt4 book ai didi

java - 使用 Processbuilder 从 Java Web 应用程序调用 Python 脚本

转载 作者:行者123 更新时间:2023-11-28 23:11:16 26 4
gpt4 key购买 nike

我正在开发一个简单的气象站 - 我想使用 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 并运行它。结果什么都没有打印(当然我已经更改了代码以将输出记录到日志文件,它工作正常,我可以看到里面的其他日志)。日志中没有问题,看起来 reader 从未返回一行。
我相信应用程序不会等待进程产生输出,但我不知道为什么。重要的是:产生传感器的输出最多需要几秒钟。我还为了测试目的更改了 python 脚本以立即返回值:

print("22.4;33.0")

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

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

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

最佳答案

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

关于java - 使用 Processbuilder 从 Java Web 应用程序调用 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com