当前位置: 首页 > 知识库问答 >
问题:

从Java程序启动一个Python脚本,该脚本监听来自所述Java程序的套接字连接

郎琪
2023-03-14

我正在尝试从我的Java程序启动一个python脚本--这个python脚本监听来自Java程序的套接字连接,并用数据进行响应。为此,我尝试使用ProcessBuilder API:

  1. 激活python virtualenv(位于我的工作目录中)
  2. 运行我的python脚本predictprobability.py,使它开始侦听来自我的Java程序的连接。这是我目前所掌握的:
public class MLClassifierProcess{
                                                //bash location        //activate python venv  //python interpreter      //script
    final String[] command_to_run = new String[] { "/bin/bash", "-c", "/env/bin/activate;", "/env/bin/python","predictprobability.py;" };
    public void startML(){
        ProcessBuilder builder = new ProcessBuilder(command_to_run);
        Process pr = null;

        try {
            pr = builder.start();
        } catch (IOException ioException) {
            System.out.println("error");
        }

    }
    public static void main(String[] args){
        MLClassifierProcess p = new MLClassifierProcess();
        p.startML();
    }

}

但是,当脚本predictprobability.py应该无限期地继续运行时,运行main函数就会立即终止。我是ProcessBuilder API的新手,因此如果您提供有关如何继续的任何指示,将非常感谢

共有1个答案

阎宝
2023-03-14

如果您的Java程序退出,那么您启动的Python进程将退出,并且当父进程死亡时子进程也会被杀死,除非它们已经与该进程分离。

如果您希望您的Java程序一直运行到Python程序完成执行,那么您需要让Java代码适当地等待。以下是如何让它这样做:

public class MLClassifierProcess{
    //bash location        //activate python venv  //python interpreter      //script
    final String[] command_to_run = new String[] { "/bin/bash", "-c", "/env/bin/activate;", "/env/bin/python","predictprobability.py;" };
    public Process startML(){
        ProcessBuilder builder = new ProcessBuilder(command_to_run);
        Process pr = null;

        try {
            pr = builder.start();
        } catch (IOException ioException) {
            System.out.println("error");
        }
        return pr;
    }
    public static void main(String[] args){
        MLClassifierProcess p = new MLClassifierProcess();
        Process pr = p.startML();
        if (pr != null)
            pr.waitFor();
    }
}
 类似资料:
  • 问题内容: 我想在我的Java程序中执行shell脚本,并传递如下所示的参数: 然后test.sh将调用另一个传递字符串参数的java程序,如下所示: 最后程序anther.jar将以这种格式解释参数 我对此感到有些困惑,因为在这种情况下我无法正确处理转义字符。 我在第一个命令中尝试了一些字符串格式,但没有获得正确的格式。 一些帮助就可以了! 谢谢! 问题答案: 我认为您最好使用 exec(Str

  • 问题内容: 我尝试谷歌搜索答案,但没有运气。 我需要使用我的超级计算机服务器,但是要运行我的python脚本,必须通过shell脚本执行。 例如我要执行 如何做到这一点? 问题答案: 只需确保python可执行文件在PATH环境变量中,然后在脚本中添加 细节: 在文件job.sh中,放入 执行此命令以使脚本可运行: 运行 :

  • 协同程序 当调用一个函数时,在它返回之前,会一直运行到完成。这意味着该函数中的任何动作都必须在一帧内完成;函数调用不能包含过程动画或一段时间内的事件序列。例如有这样一个任务,逐渐降低一个对象的 alpha(不透明度)值,直到它完全不可见。 void Fade() { for (float f = 1f; f >= 0; f -= 0.1f) { Color c = rend

  • 问题内容: 我正在尝试从CGI脚本启动后台进程。基本上,提交表单时,CGI脚本将向用户指示他或她的请求正在处理中,而后台脚本则进行实际处理(因为该处理往往会花费很长时间。)我面临的问题是Apache不会在子脚本终止之前将父CGI脚本的输出发送到浏览器。 一位同事告诉我,我想做的事情是不可能的,因为无法阻止Apache等待CGI脚本的整个过程树消失。但是,我在网络上也看到了很多关于“双叉”技巧的参考

  • 问题内容: 我在String变量中有一个Rscript,我想从Java程序执行它并将一些变量传递给它。如果我独立执行该R脚本,则可以正常工作。我已通过使用Python程序将所有脚本转义,从而将该R脚本转换为一行,如下所示: 我将打印出的字符串用完,并将其存储在String变量中,然后使用以下代码执行,但它根本不起作用。我正在传递和可变到上述R脚本。 上面的代码可以与bash shell脚本一起正常

  • 这是我在我的 问:是否有可能在此之前简单地执行另一个脚本,而不必编写额外的脚本? 伪代码: 而不是: