1

I have been working on java app that uses python script to run some 3d visualization, it worked when I was running it from intellij but once I created jar file it just doesn't run. OS: MAC OS

How I run script: Process p1 = Runtime.getRuntime().exec("python3 vizualize3D.py");

14
  • instead of python3 visualize3D.py do PYTHONPATH=/path/to/your/python/project /path/to/your/interpreter/python /path/to/your/python/script.py. E.g. if your python project is in /home/devfofikicar/pythonproject and your python interpreter is at /usr/bin/python you do PYTHONPATH=/home/devfofikicar/pythonproject /usr/bin/python /home/devfofikicar/pythonproject/visualize3D.py Commented May 27, 2020 at 10:00
  • @TinNguyen my python file is inside project meaning when I run it in intellij I don't need to specify any path. So what path should I write? Commented May 27, 2020 at 10:05
  • You either hardcode the path (like I did in my example). Or you dynamically create an absolute path which then works on any project. Either way you need to provide the path of your working environment (PYTHONPATH), the path of your python interpreter (/usr/bin/python) and the path to the python file that is to be executed. The files have to exist somewhere in your system. Find them and for now hardcode it and see if that works. Commented May 27, 2020 at 10:08
  • @TinNguyen ok i will do that, you one more question, how do I run it then. I mean how to I use this PYTHONPATH to run it? Commented May 27, 2020 at 10:12
  • Try to run your python script from terminal. Play around with it and you will get a feeling. See image: i.imgur.com/ylvg23N.png In this example the script only works if you specify the PYTHONPATH. Commented May 27, 2020 at 10:22

3 Answers 3

2

The problem had multiple layers and solutions: 1. I didn't put .py file in jar build config 2. After putting it I always got an exception that it is null because of a typo in code 3. After trying many ways to run it this one worked Cannot run python script from java jar . The important thing is to check if you added py file to the build config and to run it in a proper way since python cannot runt files from the zip and compressed states.

Sign up to request clarification or add additional context in comments.

Comments

0

Assuming the script is in the jar file, you can get an input stream from the resource, and use it as the input to a Process created from the python interpreter:

// Note: the path to the script here is relative to the current class
// and follows strict resource name rules, since this is in a jar file
InputStream script = getClass().getResourceAsStream("visualize3D.py");

// The following creates a process to run python3.
// This assumes python3 is on the system path. Provide the full
// path to the python3 interpreter (e.g. /usr/bin/python3) if it's
// not on the path.

// The - option to python3 instructs it to execute a script provided
// as standard input.

Process process = new ProcessBuilder("python3", "-")
    .start() ;
OutputStream out = process.getOutputStream();
byte[] buffer = new byte[1024];
int read = 0;
while((read = script.read(buffer)) != -1) {
    pos.write(buffer, 0, read);
}
script.close();

For details on getting the correct path for the script, see How do I determine the correct path for FXML files, CSS files, Images, and other resources needed by my JavaFX Application?

1 Comment

Comments are not for extended discussion; this conversation has been moved to chat.
0

I've tried all solutions provided; inorder to run a python script present inside a jar file.

My best bet would be to NOT keep the python files inside jar, which ultimately worked for me. Instead keep them at same location/level with jar and use following code to invoke python script from a java class inside the jar.

String pyScriptPath = "./py_script.py"; 

ProcessBuilder pb = new ProcessBuilder("python3" + pyScriptPath);
Process process = pb.start();

So the dir structure would be something like:

../rootFolder
    - javaProgram.jar
    - py_script.py

1 Comment

That is very similar to the solution, in my solution java program loads line by line file from jar into python interpreter. I quess this would be another solution to package and distribute py file in jar, and then when needed, save it to users pc, and run python on that file.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.