gpt4 book ai didi

Java - 运行Python脚本并监视连续输出

转载 作者:行者123 更新时间:2023-12-01 10:10:43 25 4
gpt4 key购买 nike

我正在使用 Raspberry Pi 从 RC522 读卡器接收一些 RFID 卡的 UID。我正在运行的 python 脚本在这里:https://github.com/mxgxw/MFRC522-python

由于各种原因我不会详细讨论,我必须在 Java 中处理这些 ID。

看来最可行的解决方案是运行 python 脚本并将结果读入 Java。问题是,Python 代码提供连续输出,当卡被敲击到读卡器上时,它会将卡的 ID 打印到控制台窗口中,并且只会根据用户的命令终止。

我目前正在使用 ProcessBuilder 来执行脚本,但是它似乎更适合运行程序并将立即结果读回 Java(如果我的话,这当然是 null尚未将卡敲击读卡器)。我尝试在 while(true) 循环中执行代码以连续启动该进程 - 但这不起作用:

    import java.io.*;

public class PythonCaller {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// set up the command and parameter
String pythonScriptPath = "/home/pi/MFRC522-python/Read.py";
String[] cmd = new String[3];
cmd[0] = "sudo";
cmd[1] = "python"; // check version of installed python: python -V
cmd[2] = pythonScriptPath;

// create runtime to execute external command
ProcessBuilder pb = new ProcessBuilder(cmd);

// retrieve output from python script
pb.redirectError();

while(true){
Process p = pb.start();
System.out.println("Process Started...");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
int ret = new Integer(in.readLine()).intValue();
System.out.println("value is : "+ret);
}
}
}

控制台窗口上的输出是空白的 - 没有抛出异常或 println。

任何帮助将不胜感激!!

谢谢

编辑 - 我将我的代码放在 try/catch 中,看看是否有任何东西被抛出,但情况似乎并非如此

最佳答案

我使用以下程序尝试重现该问题

PythonCaller.java

import java.io.*;    
public class PythonCaller {

public static void main(String[] args) throws IOException {
// set up the command and parameter
String pythonScriptPath = "/home/pi/test.py";
String[] cmd = { "python", pythonScriptPath };

// create runtime to execute external command
ProcessBuilder pb = new ProcessBuilder(cmd);

// retrieve output from python script
pb.redirectError();

while(true){
Process p = pb.start();
System.out.println("Process Started...");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
int ret = new Integer(in.readLine()).intValue();
System.out.println("value is : "+ret);
}
}
}

测试.py

uid =(123,456,789,999)
print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
  1. 方法pb.redirectError()不会修改任何内容。它返回一个值,您的代码对此不执行任何操作。 (参见 http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectError%28%29 )。您想要的可能是 redirectErrorStream(boolean redirectErrorStream)

  2. Python测试程序的第二行直接取自“Read.py”(第44行)。它会导致 java intValue() 方法出现错误。如果我用 String ret = in.readLine(); 替换它,该程序似乎可以工作。

  3. 由于Process p = pb.start();位于循环内部,因此会重复调用python子程序。

下一步应该尝试在控制台中手动运行 python 程序,看看它会做什么。

(注意:我必须删除“sudo”并更改路径才能在我的系统上进行测试,您应该没有问题更换设置的内容)。

关于Java - 运行Python脚本并监视连续输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143043/

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