Java 捕获python命令的输出
我有以下python脚本Java 捕获python命令的输出,java,python,Java,Python,我有以下python脚本 #!/usr/bin/env python import subprocess import sys from time import sleep p = subprocess.Popen(["ls", "-l", "."], stdout=subprocess.PIPE) output, err = p.communicate() print "*** Running ls -l command ***\n", output print "I'm gonna wai
#!/usr/bin/env python
import subprocess
import sys
from time import sleep
p = subprocess.Popen(["ls", "-l", "."], stdout=subprocess.PIPE)
output, err = p.communicate()
print "*** Running ls -l command ***\n", output
print "I'm gonna wait 1 second"
sleep(1)
print "Waited..."
sleep(5)
print "Finished"
以及执行该脚本的以下Java程序:
protected List<String> runOutputLinesCommand(String scriptsPath) {
List<String> ret = new ArrayList<String>();
// constructs the python command to be executed
String cmd = scriptsPath
+ COMMAND;
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
try {
// executes the command and waits for its interruption
Process p = pb.start();
String s;
// read from the process's combined stdout & stderr
BufferedReader stdout = new BufferedReader(new InputStreamReader(
p.getInputStream()));
while ((s = stdout.readLine()) != null) {
// appends the output of the command to the ret variable
ret.add(s.trim());
}
p.waitFor();
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (InterruptedException ex) {
ret.add("script interrupted: " + ex);
} catch (IOException ex) {
ret.add("IOException: " + ex);
ex.printStackTrace(System.out);
} catch (Exception ex) {
ret.add("Exception: " + ex);
ex.printStackTrace(System.out);
}
return ret;
}
受保护列表runoutputlinescomand(字符串scriptsPath){
List ret=new ArrayList();
//构造要执行的python命令
字符串cmd=scriptsPath
+指挥部;
ProcessBuilder pb=新的ProcessBuilder(cmd);
pb.重定向错误流(真);
试一试{
//执行命令并等待其中断
进程p=pb.start();
字符串s;
//从流程的组合标准输出和标准输出中读取
BufferedReader标准输出=新的BufferedReader(新的InputStreamReader(
p、 getInputStream());
而((s=stdout.readLine())!=null){
//将命令的输出追加到ret变量
重新添加(s.修剪());
}
p、 waitFor();
p、 getInputStream().close();
p、 getOutputStream().close();
p、 getErrorStream().close();
}捕获(中断异常例外){
ret.add(“脚本中断:”+ex);
}捕获(IOEX异常){
ret.add(“IOException:+ex”);
例如printStackTrace(系统输出);
}捕获(例外情况除外){
补充(“例外情况:+ex”);
例如printStackTrace(系统输出);
}
返回ret;
}
我想要的是java程序实时打印正在执行的python行,而不是在执行所有脚本之前。我希望Java程序在python脚本输出时打印它。如何在java中实现这一点?您需要打印Python程序的每一行输出,而不是(或者)将其附加到
ret
:
while ((s = stdout.readLine()) != null) {
//ret.add(s.trim());
System.out.println(s);
}
根据我的经验,为了确保Python脚本的输出没有缓冲,除了DNA建议的之外,还需要禁用输出缓冲。因此,请确保使用
-u
标志调用脚本到解释器;另外,sys.stdout.flush()
可能是必需的
有关更多信息,请参阅或仅谷歌“python输出缓冲”或“python禁用输出缓冲”