首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用ProcessBuilder让BufferedReader显示正在运行的python脚本的实时输出?

使用ProcessBuilder可以在Java中执行外部进程,并且可以通过获取进程的输入流来实时获取输出。下面是一个使用ProcessBuilder来实现该功能的示例代码:

代码语言:txt
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class PythonProcess {
    public static void main(String[] args) {
        try {
            // 创建ProcessBuilder对象,并指定要执行的命令
            ProcessBuilder pb = new ProcessBuilder("python", "your_script.py");
            // 启动进程
            Process process = pb.start();

            // 获取进程的输入流
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            // 实时读取输出并显示
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待进程执行结束
            int exitCode = process.waitFor();
            System.out.println("Process exited with code " + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上述代码中,我们创建了一个ProcessBuilder对象,并指定要执行的命令为"python your_script.py",其中"your_script.py"是你要运行的Python脚本文件。然后,我们通过调用start()方法启动进程,并获取进程的输入流。通过读取输入流中的内容,我们可以实时获取Python脚本的输出,并将其显示出来。

需要注意的是,如果Python脚本的输出较多或较频繁,可能会导致Java程序阻塞在读取输出的地方。为了避免这种情况,可以在读取输出的过程中使用多线程来实现异步读取和显示。

此外,关于ProcessBuilder的更多用法和详细说明,可以参考腾讯云的相关文档:ProcessBuilder

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java调用python方法

本文将介绍如何在Java中调用Python方法步骤和方法。...步骤概述要在Java中调用Python方法,我们可以使用JavaProcessBuilder类来执行Python解释器,并通过输入输出流与Python进程进行通信。...确保脚本已保存在本地,并记下脚本路径。编写Java代码:在Java项目中,使用ProcessBuilder类来执行Python解释器,并通过输入输出流与Python进程进行通信。...在获取Python进程输出时,我们使用BufferedReader类读取进程输入流,并逐行处理输出结果。你可以根据脚本具体输出格式进行相应处理。...最后,我们使用waitFor方法等待Python进程执行完毕,并获取其退出值。运行和调试在运行Java代码之前,请确保已经安装了Python,并且已经准备好了要调用Python脚本

29510

Process类详解

(); } 注意 ProcessBuilder 第一个参数必须是可执行程序,可以添加参数使用{"cmd", "/c"} 或 {"/bin/bash", "-c"}。...因此,在调用这样进程时,必须为其提供输入。 一个外部进程输出可能会耗尽该进程输出流与错误流缓冲区。当发生这种情况时,Java 程序可能会阻塞外部进程,同时阻碍Java程序与外部程序继续运行。...因此,在运行一个外部进程时,如果此进程往其输出流发送任何数据,则必须将其输出流清空。类似的,如果进程会往其错误流发送数据,其错误流也必须被清空。...因此,只要能够保证进程不会使用这些流,那么在程序中可以忽略其输入流、输出流、以及错误流。...().exec()来调用,他会生成一个新进程去运行调用程序,waitFor()方法也有很明显弊端,因为java程序给进程输出流分配缓冲区是很小,有时候当进程输出信息很大时候回导致缓冲区被填满

1.5K20

Java 调用 shell 控制超时时间

背景平台开发经常需要使用 shell 脚本调度大数据组件,在使用 springBoot 开发项目时也是如此,为了保证子 shell 执行时间可控,需要设置超时时间,如果 shell 无法在给定时间内返回...processBuilder 构建 process 调度 shell 脚本 URL url = Main3.class.getResource("/say_hello.sh");...destroy 掉子进程,destory 子进程同时也会将 InputStream 流关闭,导致子进程计算结果无法获取,为了避免这种情形,可以考虑使用一个单独线程获取结果。...中, 为了避免阻塞主逻辑(发现超时时,kill 掉子进程),使用独立线程取数 BufferedReader reader = new BufferedReader(new InputStreamReader...public abstract void destroy()底层使用一个 JNI(java native interface)方法,可能是异步执行,并不会同步 kill 掉进程返回,因此需要等待一小段时间

2.1K20

项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!

很多小伙伴都希望通过Git深入了解他们代码统计数据。因此,我决定写一篇文章,不仅使用传统bash脚本方式,还会用Java、Python、Go三种热门编程语言来实现。让我们开始吧!...你可以将这个脚本保存为git_stats.sh,然后在项目目录中运行它来获取统计信息。确保你脚本有执行权限(你可以使用chmod +x git_stats.sh来给它添加执行权限)。 2....Java实现统计功能 Java提供了ProcessBuilder来帮助我们执行和控制进程。我们可以利用这个特性来运行Git命令,并解析输出。...以下是一个简单Java实现思路: 使用ProcessBuilder调用Git命令:Java可以通过ProcessBuilder类来执行外部命令。你可以用它来运行Git命令,获取提交日志。...为了运行这段代码,你需要确保你Python环境已经设置好,并且你机器上已经安装了Git命令行工具。 4. Go语言实现 Go语言也提供了调用子进程功能,我们可以使用os/exec包来实现。

19010

Java中进程与线程

引言在计算机编程中,进程和线程是两个重要概念。进程是指一个正在执行程序实例,而线程则是进程中一个执行单元。Java作为一种面向对象编程语言,提供了对进程和线程支持。...本文将详细介绍Java中进程和线程概念、特点以及使用方法。一、进程概念和特点进程概念进程是操作系统分配资源基本单位,它是程序一次执行过程。...每个进程都有自己内存空间和系统资源,可以独立运行。进程之间相互独立,互不干扰。进程特点(1)独立性:进程拥有自己内存空间和系统资源,互不干扰。...三、Java中进程操作创建进程 在Java中,可以使用ProcessBuilder类来创建一个新进程。ProcessBuilder类提供了一种灵活方式来构建和管理进程。...下面是一个获取进程输出示例代码:InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader

15120

Java魔法堂:调用外部程序

认识java.lang.Runtime#exec方法 作用:用于调用外部程序,并重定向外部程序标准输入、标准输出和标准错误到缓冲池。功能就是和windows运行”一样。 ?...变量作用域:命令运行结束后,通过该参数设置环境变量将失效; 1.2....注意:不支持直接使用>或>>执行标准输出重定向。...另外,缓冲池容量是一定,因此若外部程序在运行过程中不断向缓冲池输出内容,当缓冲池填满,那么外部程序将暂停运行直到缓冲池有空位可接收外部程序输出内容为止。...简化输入输出重定向java.lang.ProcessBuilder 功能和java.lang.runtime#exec一样,只是java.lang.ProcessBuilder仅接收命令行以数组形式传递给

1.6K10

Java程序员日常 —— 多进程开发

最近再弄进程管理相关工作,因此必要就涉及到各种系统下关于进程管理。 这里简单介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令。...获得进程输出信息: BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); String...","/all"); Process process = builder.start(); 获得输出信息同上面,但是多了一个合并输出和错误功能: builder.redirectErrorStream...获取进程列表 对比进程列表,得到最新启动进程 因此,就需要知道如何获得进程列表: windows版本获得进程列表 Runtime.getRuntime().exec("cmd /C tasklist...(); 停止进程 同上面相似,需要使用对应版本命令: windows版本停止进程 Runtime.getRuntime().exec("cmd /C taskkill /F /PID " +

1.1K90

Java 配 Shell 等于美酒加咖啡

先假设一个场景:BOSS 你实现一个服务监控指挥室,能看到每个服务器磁盘剩余空间,能看到。。。能看到。。。...1024 / 1024)); System.out.println(String.format("空闲内存空间 %d M", runtime.freeMemory() / 1024 / 1024)); 代码运行输出如下...Linux df 命令,用于显示目前在系统上磁盘使用情况统计,主要用于查看磁盘分区,磁盘已使用空间,剩余空间。 命令如下: df [选项]... [FILE]... 常用选项如下: ?...,磁盘已使用空间,剩余空间 //df -h以合适单位来显示信息 System.out.println(exec("df -h")); } private...如果关注一猿小讲伙伴应该清楚,在《如何Java应用成为杀不死小强?(中篇)》《如何Java应用成为杀不死小强?

78030

Java程序员日常 —— 多进程开发IO阻塞问题

本篇仍旧是源于最近工作,总结一下纪念那些年埋下坑... 背景故事 需求:“使用进程方式启动另一个程序!” 开发:“OK!...遇到问题 由于运行程序比较复杂,有可能出现错误输出。这时就不好保证是错误输出还是标准输出哪个先到。但是上面的程序中,使用了同步方式输出子进程消息,结果就导致了子进程阻塞。...解决方案1:使用缓冲区缓存消息 这个可以参考CSDN帖子 解决方案2:使用ProcessBuilder合并标准输出和错误 仍然源自于上面的博客: try{ String[] cmds = {"...环境变量是独立,因此可以被修改,但是不会影响其他进程。 directory 工作目录,如果返回是Null,说明当前目录使用是系统变量user.dir所在目录。...线程安全 注意这个类不是线程安全,因此如果多个线程使用ProcessBuilder实例,并且修改属性,那么可能会造成冲突。因此需要在外面进行线程同步。

1.4K50

java调用外部应用程序

ffmpeg -i input.mp4 output.avi 在java中调用外部应用一般都会使用 Runtime.getRuntime().exec(); 以前其实也使用过,但是没有过深入研究,在使用是发现也会有各种无法预料问题出现...回过头来看看,刚exec方法,主要是三个参数: 命令以及参数 start dir;explore dir等 运行环境,解析${} 工作目录,按照我理解应该相当于cmd中cd到目录进行执行程序 那到底是什么原因导致无法找到...最后其实在ffmpeg命令前添加 cmd /c 即可,但是百度cmd /c 主要作用是在执行脚本时保持关闭当前窗口。具体是什么原因导致这样差别而引起程序运行怪异现象?...当然在实际项目中,使用其实是apache commons-exec,使用上其实差不多,主要是在过程中做了一些处理,针对一些问题进行了封装,同时引入了一些类似于监控狗处理超时,输出使用了现场处理,同时使用了异步模式处理...} catch (ExecuteException e) { e.printStackTrace(); } } 使用脚本完成

3.5K70

Java:记录一次 Process调用系统命令,waitFor()阻塞不返回问题及解决方案

一、问题现象 在Java程序中,启动另一个进程执行一个命令时可以使用ProcessBuilder类启动一个进程。...以运行 ps 命令为例: ProcessBuilder processBuilder = new ProcessBuilder("ps"); processBuilder.redirectErrorStream...但有一个问题,当命令输出很多内容时,waitFor方法会一直卡着不返回。这个问题原因是打开进程输出内容没有被读取。缓冲区满被阻塞了。剩余内容输出被阻塞了,所以一直卡在那里。...二、解决方法 解决方法比较简单就是:输出内容一定要被读出来。...try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) {

17710

java 执行shell命令及日志收集避坑指南

但总体来说 ProcessBuilder 可控性更强,所以一般使用这个会更自由些。   ...而外部进程通信,又不像一个普通io调用,直接输出结果信息。这往往需要我们通过两个输出流进行捕获。而如何读取这两个输出流数据,就成了我们获取日志信息关键了。...ProcessBuilder使用inputStream 和 errStream 来表示两个输出流, 分别对应操作系统标准输出流和错误输出流。...但这两个流都是阻塞io流,如果处理不当,则会引起系统假死风险。     6. 进程异常如何捕获?       在jvm线程里产生异常,可以很方便直接使用try...catch......主要使用 ProcessBuilder 完成了shell调用;     2. 支持读取进程所有输出信息,且在必要时候,支持使用单独文件进行接收输出日志;     3.

2.5K10

tail 命令我对日志追踪有了进一步理解

想象归想象,如果你想要一个快速实时日志收集工具,那tail确实是个非常棒工具。它比什么flume、logstatsh,比什么filebeat之类,快捷多。...= ps.start(); //持续读取tail输出 try (BufferedReader in = new BufferedReader(new InputStreamReader...然后把标准输出和标准错误流,全部定向到BufferedReader中。接下来,你能做你想要做任何事。 这有一定风险,假如tail命令被杀掉了,我们Java程序就失去了作用。...那这个滚动,是如何呢?我们可以收工模拟这个过程。...如果有这个文件,正在被其他进程所使用,那这些文件你看起来像是删掉了,但它内容却不释放。 lsof | grep deleted 上面这个命令,能够看到这些失控文件。

55810

别小看tail 命令,它难倒了技术总监!

想象归想象,如果你想要一个快速实时日志收集工具,那tail确实是个非常棒工具。它比什么flume、logstatsh,比什么filebeat之类,快捷多。...= ps.start(); //持续读取tail输出 try (BufferedReader in = new BufferedReader(new InputStreamReader...然后把标准输出和标准错误流,全部定向到BufferedReader中。接下来,你能做你想要做任何事。 这有一定风险,假如tail命令被杀掉了,我们Java程序就失去了作用。...那这个滚动,是如何呢?我们可以收工模拟这个过程。...如果有这个文件,正在被其他进程所使用,那这些文件你看起来像是删掉了,但它内容却不释放。 lsof | grep deleted 上面这个命令,能够看到这些失控文件。

63220

设计模式(十五)命令模式

命令模式也是一种行为型模式,当我们系统中需要处理各种命令(例如命令行)时候,可以考虑使用命令模式,将命令封装为对象。这样和将命令直接硬编码到程序中相比,无疑是更好。...检测方法很简单,就是使用各种编译环境-version参数来查看一下版本,如果获取到版本号就说明当前编译环境是可用。 首先,我们新建一个接口,作为检测接口。后面的命令对象都需要实现该接口。...子类只需要简单继承父类并传入命令行即可。关于Process类使用方法,可以参考我另一篇文章Java 调用外部程序。...class PythonCommand extends AbstractCommand { public PythonCommand() { super("python --version...如果电脑上安装有相应开发环境或SDK,那么就会显示对应版本信息。

49380

爬虫还能这么玩-防采集?MSUP阿里加密视频沦陷!

规则模块能力范围包括: 拦截并修改正在发送请求 可修改内容包括请求头(request header),请求体(request body),甚至是请求目标地址等 拦截并修改服务端响应 可修改内容包括.../rule.js 我们使用脚本示例 module.exports = { * beforeSendResponse(requestDetail, responseDetail) {...id=165&videoId=0 观察控制台,发现可以打印出我们需要视频地址信息 拷贝地址使用 ffplay 播放确认是否可用 ffplay url 控制台有日志输出,并且开始播放,binggo~,...ffmpeg -i [url] [test.mp4] springboot 使用springboot目的是把整个流程脚本化执行批量下载,关于所有视频信息获取,有兴趣自行研究吧,这里只介绍如何根据得到视频信息自动下载...我们需要借助 anyproxy rule 脚本能力 拦截 response 把视频地址发送到我们程序,然后自动下载。接口请求使用 axios 库。

18520
领券