如何解决Java无法运行大型Python文件
我有一个Python脚本,试图通过Java代码运行。
在我的Ubuntu虚拟机上通过Linux终端命令运行Python脚本时,该脚本运行正常,与通过Java脚本传递的命令相同。
当运行与我尝试运行的Python脚本相比运行速度更快的其他Python脚本时,Java代码运行良好。
但是,尽管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文件,然后等待15分钟后由Java程序读取该文件(或者您可以告诉线程等待完成-process.WaitFor()
返回{{1 }}。
1
上面的脚本是Python脚本的良好替代。如果将Python脚本的睡眠时间降低到10分钟,则Java发出命令时它将运行。但是,在上面显示的睡眠时间,Java显然无法运行脚本,或者脚本运行尝试以失败告终。
其他信息:使用JavaFX按钮激活Java命令。 Java脚本是在IntelliJ IDEA中开发的,而Python脚本是使用PyCharm创建的。
我的问题是,当两个脚本都可以正常运行时,可能导致此问题的原因是什么?
解决方法
作为一个简单的建议,您不应该依赖带有固定参数(例如15分钟)的Thread.sleep方法。您的数据可能会增长或收缩,并且这种处理方式效率不高。
您可以尝试调用import os
import glob
from mutagen.easyid3 import EasyID3
mp3_files_list = glob.glob(path/to/your/mp3-files-folder/*.mp3) # example path /home/user/Downloads/mp3/*.mp3
for mp3_file in mp3_files_list:
audio = EasyID3(mp3_file)
if not audio['title']: # if title tag is empty
os.remove(mp3_file)
if not audio['artist']:
os.remove(mp3_file)
# etc tags check
方法,以便当python进程结束时,您的线程继续。
此外,您可以尝试使用Process.waitFor()
,在遇到有问题的系统执行程序案例时,有时会有所帮助。
这是一些代码。在ProcessBuilder
中,您无法更改python程序,但是要使sub()
正常工作,您必须修改python程序,以使其输出位于标准输出上,并且Java会将重定向到输出.txt文件。
sub2()
,
我能够对其进行一些小的修改。我使用了相对文件位置和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()
,
这是超时错误。无法修复。只需在Java和Python之间选择并编写所有内容即可。没有理由同时使用两者。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。