Interfacing Java with other stuff is always a pain.
The first thing I would try is running a simple Shell command from Java in order to run a command like "python myScript.py".
I've written this code in the past to run a shell command in java. I've used this to run C++ apps from a Java program.
Although that code tries to read from both the output stream and the error stream, it's still prone to deadlock. If the process outputs a lot to its error stream, and the error stream buffers become full, your code is still trying to read from the output stream. However, there's nothing coming to that because the process is blocked on its error stream, which you're not consuming yet. It also won't end because the process doesn't end.
There are two solutions:
1) Do the reads in two threads, one for the output and one for the input. This is what When Runtime.exec() won't teaches us. Be careful about interleaving the two though.
2) Use ProcessBuilder and call redirectErrorStream(true). You'll then only need to read from the process' output stream.
I prefer the latter, because it lets the JVM and/or OS deal with merging the two streams.