java无法运行大型python文件

sirbozc5  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(297)

我有一个python脚本,我正试图通过java代码运行它。
在我的ubuntu虚拟机上运行linux终端命令时,python脚本运行良好,使用的命令与通过java脚本传递的命令相同。
当运行一个不同的python脚本时,java代码运行得很好,该脚本的运行速度比我尝试运行的python脚本快。。
然而,尽管python脚本运行良好,java脚本运行良好,但不知何故,当我将两者放在一起时,什么都没有发生:txt文件没有更新,所以java脚本打印出它包含的任何旧值。

System.out.println("starting...");
try {
    Process process = Runtime.getRuntime().exec("python3 /home/.../PycharmProjects/.../fraudanalysis.py abc def");
    Thread.sleep(900000);
    # Or try System.out.println(process.waitFor());
    File file = new File("/home/.../PycharmProjects/.../output.txt");
    Scanner newLineReader = new Scanner(file);
    System.out.println(newLineReader.nextLine());
} catch(Exception e) {
    System.out.println(e);
}

上面的代码应该在提供的绝对目录下使用两个参数运行python3脚本。python3脚本在大约13分钟后完成,并更新output.txt文件,然后java程序在等待15分钟后读取该文件(或者您可以告诉线程等待完成-- process.WaitFor() 退货 1 ).

def testScript():
    time.sleep(780)
    return_string1 = sys.argv[1]
    return_string2 = sys.argv[2]

    outputFile = open(os.path.dirname(os.path.abspath(__file__)) + "/output/output.txt", "w+")
    outputFile.write(return_string1 + " " + return_string2)
    print("Python run complete")

if __name__ == "__main__":
    testScript()

上面的脚本是python脚本的一个很好的替代品。如果您将python脚本的睡眠时间降低到10分钟,那么它将在java发送命令时运行。但是,在上面显示的休眠时间,java显然无法运行脚本,或者脚本运行尝试以失败告终。
附加信息:使用javafx按钮激活java命令。java脚本是用intellij idea开发的,python脚本是用pycharm创建的。
我的问题是,当两个脚本都能自己正常工作时,出现这个问题的可能原因是什么?

bd1hkmkf

bd1hkmkf1#

我只做了一点小小的修改就可以让它工作了。我使用了相对文件位置和timeunit.minutes.sleep(15);

package org.openjfx;

import java.io.File;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class TestWait {
    public static void main(String[] args) {
        System.out.println("starting...");
        String dir="src/main/resources/org/openjfx/";//location of the python script

        try {
            System.out.println("Working Directory = " + System.getProperty("user.dir"));
            //System.out.println("python3 " + dir+"fraudanalysis.py abc def");
            Process process = Runtime.getRuntime().exec("python3 " + dir+"fraudanalysis.py abc def");
            System.out.println(process.waitFor());
            TimeUnit.MINUTES.sleep(15);
            File file = new File("src/main/resources/org/openjfx/output.txt");
            Scanner newLineReader = new Scanner(file);
            System.out.println(newLineReader.nextLine());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

这是我用的Python。

import sys
import time
def testScript():
    return_string1 = sys.argv[1]
    return_string2 = sys.argv[2]
    time.sleep(780)
    outputFile = open("src/main/resources/org/openjfx/output.txt", "w+")
    outputFile.write(return_string1 + " " + return_string2)
    print("Python run complete")

if __name__ == "__main__":
    testScript()
p4rjhz4m

p4rjhz4m2#

作为一个简单的建议,您不应该依赖thread.sleep方法和固定参数,例如15分钟。您的数据可能会增长或收缩,这种处理方式效率低下。
你可以试着打电话给 Process.waitFor() 方法,以便在python进程结束时,线程继续。
此外,你可以尝试使用 ProcessBuilder 这有时有助于面对有缺陷的系统执行案件。
这里有一些代码。在 sub() ,您不能更改python程序,但 sub2() 为了工作,您必须修改python程序,使其输出在标准out上,java将重定向到output.txt文件。

public void sub() {
    System.out.println("startig...");
    Scanner newLineReader = null;
    try {
        Process process = Runtime.getRuntime().exec("python3 /home/.../PycharmProjects/.../fraudanalysis.py /home/.../PycharmProjects/.../fraudAnalysis.db 500");
        process.waitFor();
        File file = new File("/home/.../PycharmProjects/.../output.txt");
        newLineReader = new Scanner(file);
        String line;
        while((line=newLineReader.nextLine())!=null) {
            System.out.println(line);
        }

    } catch(IOException ioe) {
        ioe.printStackTrace();
    }catch(InterruptedException ie) {
        ie.printStackTrace();
    }finally {
        newLineReader.close();
    }
}

public void sub2() {
    ProcessBuilder pb =
       new ProcessBuilder("python3", 
               "/home/.../PycharmProjects/.../fraudanalysis.py", 
               "/home/.../PycharmProjects/.../fraudAnalysis.db", "500");

    File log = new File("/home/.../PycharmProjects/.../output.txt");
    pb.redirectErrorStream(true);
    pb.redirectOutput(Redirect.appendTo(log));
    Process p = null;
    try {
        p = pb.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        p.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Scanner newLineReader = null;
    try{
        newLineReader = new Scanner(log);
        String line;
        while((line=newLineReader.nextLine())!=null) {
            System.out.println(line);
        }
    }catch(IOException ioe) {
        ioe.printStackTrace();
    }
}
w3nuxt5m

w3nuxt5m3#

这是一个超时错误。无法修复。只需在java和python之间进行选择,并在其中编写所有内容。没有理由两者都用。

相关问题