无法从Java jar运行python脚本

问题描述 投票:0回答:1

虽然在IntelliJ中工作,但一切正常,但是在我构建jar之后,它停止了。一开始,只是我忘记了将其放在jar build config中,但是现在确保它已经存在之后,我仍然无法运行它。这些是我尝试的方法:

InputStream script = mainView.class.getResourceAsStream("vizualize3D.py");
Process process = new ProcessBuilder("python3", "-").start() ;

Process p1 = Runtime.getRuntime().exec("python3 " + script);

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("python3 " + mainView.class.getResourceAsStream("vizualize3D.py"));

尽管有资源,但没有主题工作。我还尝试在IntelliJ项目中指定它的路径,并且它可以工作,但仅当我从jar启动它之后才从IntelliJ运行时,它却无法。

编辑1:对于那些不了解py文件的人在jar文件中]

java python javafx jar executable-jar
1个回答
0
投票

涉及您尝试执行"python3 "+script的所有选项和等效选项均无效。 scriptInputStream,不是文件系统上的路径,因此仅将其与String串联将不会给您带来任何有意义的意义。另外,由于您的脚本不在自己的文件中,并且python解释器没有简单的方法来提取它,因此像这样简单地调用它是行不通的。

但是,您可以执行

python3 -

-选项在这里(至少在类似BSD的系统上)表示“从标准输入中读取,并将其解释为脚本”。然后,在Java端,您可以将jar打包的资源作为流读取,并通过管道传递到python进程的标准输入。

有关为资源选择正确路径的详细信息,请参见How do I determine the correct path for FXML files, CSS files, Images, and other resources needed by my JavaFX Application?。>

下面的脚本与该类放在同一个包中,对我有用:

PythonRunner.java:

package example.python;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class PythonRunner {

    public static void main(String[] args) throws Exception {

        String pythonInterpreter = "/usr/bin/python3" ; // default
        if (args.length > 0) {
            pythonInterpreter = args[0] ;
        }

        InputStream script = PythonRunner.class.getResourceAsStream("script.py");
        Process pythonProcess = new ProcessBuilder(pythonInterpreter, "-")
                .start();

        // This thread reads the output from the process and 
        // processes it (in this case just dumps it to standard out)
        new Thread(() ->  {
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(pythonProcess.getInputStream()))) {

                for (String line ; (line = reader.readLine()) != null ;) {
                    System.out.println(line);
                }
            } catch (IOException exc) {
                exc.printStackTrace();
            }
        }).start();

        // read the script from the resource, and pipe it to the
        // python process's standard input (which will be read because
        // of the '-' option)
        OutputStream stdin = pythonProcess.getOutputStream();
        byte[] buffer = new byte[1024];
        for (int read = 0 ; read >= 0 ; read = script.read(buffer)) {
            stdin.write(buffer, 0, read);
        }
        stdin.close();
    }

}

script.py:

import sys

for i in range(10):
    print("Spam")

sys.exit(0)

MANIFEST.MF

Manifest-Version: 1.0
Main-Class: example.python.PythonRunner

Eclipse布局:

enter image description here

瓶子内容和运行结果:

$ jar tf runPython.jar 
META-INF/MANIFEST.MF
example/python/PythonRunner.class
example/python/script.py
$ java -jar runPython.jar 
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
$
© www.soinside.com 2019 - 2024. All rights reserved.