虽然在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文件中]
涉及您尝试执行"python3 "+script
的所有选项和等效选项均无效。 script
是InputStream
,不是文件系统上的路径,因此仅将其与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布局:
瓶子内容和运行结果:
$ 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
$