Java process.getRuntime().exec()从不停止他的工作

Java process.getRuntime().exec()从不停止他的工作,java,python,process,Java,Python,Process,大家好,我正在用java编写一个带有servlet的web应用程序,但是我需要一个使用python的作业,所以我使用Process.getRuntime().exec()调用脚本。 我的web应用程序是一个调查,在客户编译它的过程中,我们给他拍了一张照片。 我需要python用于deepface,用于检测他的情绪,并将所有结果写入pdf文件(他选择的内容、照片和情绪检测结果)。 对于调查中的7个问题,脚本运行良好,当我提出8个问题时,他从不停止工作(脚本在不是从java调用时工作,我测试了它)。

大家好,我正在用java编写一个带有servlet的web应用程序,但是我需要一个使用python的作业,所以我使用Process.getRuntime().exec()调用脚本。 我的web应用程序是一个调查,在客户编译它的过程中,我们给他拍了一张照片。 我需要python用于deepface,用于检测他的情绪,并将所有结果写入pdf文件(他选择的内容、照片和情绪检测结果)。 对于调查中的7个问题,脚本运行良好,当我提出8个问题时,他从不停止工作(脚本在不是从java调用时工作,我测试了它)。 你能帮我理解我是如何发现错误的吗?这个过程有资源的限制还是类似的

Process p = Runtime.getRuntime().exec("python "+rootPath+"\\DeepFaceLearning\\TestFace.py "+nomeFile);
        
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String temp ="";
        while((temp = stdInput.readLine()) != null) {
                System.out.println(temp);

            }
对于python来说,脚本非常长,但我认为问题在于java,因为当我从命令行运行脚本时,他工作得很好,有40个问题。 我总共需要添加21个问题。 python脚本:

  • 拿一个文件读一下,把问题、理由和照片保存在一个文件夹里
  • 分析所有照片
  • 将所有这些信息写入pdf
  • 将pdf保存在数据库中

  • 编辑:java进入脚本,但不完成所有工作。

    如果您的python以与8问题相同的方式处理7,您可以尝试在其他
    线程中读取输入流

    比如:


    通常不要使用Process.exec对程序控制流进行配对。如果您必须在另一个技术平台上执行相关业务功能。使用Web服务使用的事件。这样你就可以扩展。@AG我别无选择,我必须这样做,我不能浪费太多的时间,我不知道如何使用Web服务,我必须在尝试之前先学习。你说的
    是什么意思。永远不要停止他的工作
    ?Java
    System.out.println(“…”)是什么,还是“挂起”?@Wulf对于7个问题,System.out.println(“…”)工作,它打印python脚本的所有打印(我使用print进行调试,Java打印python的所有打印,很抱歉这个糟糕的概念)。对于8个问题,不打印任何内容,网页处于空闲状态,正在等待一些东西,我想等待python(java进入脚本,脚本在目录中写入图像,之后不打印任何内容,java中的sout命令不打印任何内容)。我试过了,但Runnable()要求我实现run()方法。我这里有一个语法错误:“}”。“0打印,但不要保持空闲状态,很明显脚本没有执行所有作业。我添加了一些关于脚本作业的内容,他所做的只是第1点,然后继续hang@GabrielePisapia您应该更多地调试脚本。在脚本中创建一个日志文件。我认为问题不在于python,而在于java中的过程。python脚本在内存方面需要太多的资源,java无法提供python所需的所有资源。有可能吗?
    
       ...
        new Thread(new Runnable(){
    
    @Override
    public void run(){
              BufferedReader stdInput = new BufferedReader(newInputStreamReader(p.getInputStream()));
              String temp ="";
              while((temp = stdInput.readLine()) != null) {
                   System.out.println(temp);
        }}).start();