473,386 Members | 1,598 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes and contribute your articles to a community of 473,386 developers and data experts.

Three ways to run Python programs from Java

kudos
127 Expert 100+
A week ago, I presented http://bytes.com/topic/python/insigh...hon-together-c. Since then, I realized that perhaps people don't program that much in C. Perhaps people write programs in Java!

Here I present three different options running Python programs from Java; first using the (old) Runtime class, then the ProcessBuilder class and finally embedding Python code in Java, with Jython (a Python interpreter, written in Java!)

Runtime approach

First, let take something that is the old way to do it, the Runtime class.

Expand|Select|Wrap|Line Numbers
  1. import java.io.*;
  2.  
  3. class test1{
  4. public static void main(String a[]){
  5. try{
  6.  
  7. String prg = "import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
  8. BufferedWriter out = new BufferedWriter(new FileWriter("test1.py"));
  9. out.write(prg);
  10. out.close();
  11. int number1 = 10;
  12. int number2 = 32;
  13. Process p = Runtime.getRuntime().exec("python test1.py "+number1+" "+number2);
  14. BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  15. int ret = new Integer(in.readLine()).intValue();
  16. System.out.println("value is : "+ret);
  17. }catch(Exception e){}
  18. }
  19. }
  20.  
We start by making a Java String prg, which contains our Python program, this string is saved on to the file "test1.py". Next, we run the Python interpreter on our system, with the exec method in the Runtime class. We read the output from the output stream returned from the Runtime class, and convert this to an Java int.

I saved the above source code as "test2.java". the I typed the following;

javac test2.java

To execute it:

java test2

Process approach

I think that the Runtime class approach is a bit old. In the newest Java version, the one to use is the ProcessBuilder class. This gives more structure to the arguments.

Expand|Select|Wrap|Line Numbers
  1. import java.io.*;
  2.  
  3. class test2{
  4. public static void main(String a[]){
  5. try{
  6.  
  7. String prg = "import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
  8. BufferedWriter out = new BufferedWriter(new FileWriter("test1.py"));
  9. out.write(prg);
  10. out.close();
  11. int number1 = 10;
  12. int number2 = 32;
  13.  
  14. ProcessBuilder pb = new ProcessBuilder("python","test1.py",""+number1,""+number2);
  15. Process p = pb.start();
  16.  
  17. BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  18. int ret = new Integer(in.readLine()).intValue();
  19. System.out.println("value is : "+ret);
  20. }catch(Exception e){System.out.println(e);}
  21. }
  22. }
  23.  
I saved the above as "test2.java". Then I typed the following;

javac test2.java

To execute it:

java test2

Jython approach

Java is supposed to be platform independent, and to call a native application (like python) isn't very platform independent.

There is a version of Python (Jython) which is written in Java, which allow us to embed Python in our Java programs. As usually, when you are going to use external libraries, one hurdle is to compile and to run it correctly, therefore we go through the process of building and running a simple Java program with Jython.

We start by getting hold of jython jar file:

http://www.jython.org/downloads.html

(When I wrote this, the latest version was : Jython 2.5.3)

I copied jython-2.5.3.jar to the directory where my Java program was going to be. Then I typed in the following program, which do the same as the previous two; take two numbers, sends them to python, which adds them, then python returns it back to our Java program, where the number is outputted to the screen:

Expand|Select|Wrap|Line Numbers
  1. import org.python.util.PythonInterpreter; 
  2. import org.python.core.*; 
  3.  
  4. class test3{
  5. public static void main(String a[]){
  6.  
  7. PythonInterpreter python = new PythonInterpreter();
  8.  
  9. int number1 = 10;
  10. int number2 = 32;
  11.  
  12. python.set("number1", new PyInteger(number1));
  13. python.set("number2", new PyInteger(number2));
  14. python.exec("number3 = number1+number2");
  15. PyObject number3 = python.get("number3");
  16. System.out.println("val : "+number3.toString());
  17. }
  18. }
  19.  
I call this file "test3.java", save it, and do the following to compile it:

javac -classpath jython-2.5.3.jar test3.java

The next step is to try to run it, which I do the following way:

java -classpath jython-2.5.3.jar:. test3

Now, this allows us to use Python from Java, in a platform independent manner. It is kind of slow, in fact it feels like the slowest of the three presented approaches. Still, it's kind of cool, that it is a Python interpreter written in Java...
Jun 15 '13 #1
7 217338
how do we call python function with one argument by using first or second technique where python code will return string value to java program ?
Sep 23 '16 #2
Oralloy
988 Expert 512MB
I would suggest using the class ProcessBuilder to implement a non-trivial solution that includes communication.

Generating Python code on the fly is a cool thought, but is it really valuable? Most problems that I see involve invoking a sub-process that solves a problem (or class of problems); the code is well developed and debugged, so hoisting to Java (or C) is not considered valuable. Or, hoisting is not reasonable, as the problem easily solved in Python, but not in C/C++/Java.

As for the return value, there are a few options:
  1. Capture the printed output of the Python program.
  2. Have the Python program write the desired output to a well-defined file, and just ignore all other output.
  3. Check sub-process return status and act accordingly.

You might want to use an embedded Python interpreter as part of a web page that executes user entered Python in a restricted environment. For example the page may want to forbid access to all file I/O and system interface commands.

Cheers,
Oralloy!
Sep 25 '16 #3
this worked perfectly for me, but i’m facing another problem, if my python script throws any error like syntax error, the error message is not coming to my java output, i always have to run the script manually and check for any errors. Any idea how to capture that as well
Jun 8 '17 #4
Thank you for classifying different methods of calling Python from Java. I wonder if you have some thoughts about the following:

1) If you use Runtime or ProcessBuilder, is there a way to keep python running between calls and submit new commands to the existing process?

2) If you use Jython, is there a way to load C libraries for python?
Oct 5 '17 #5
canaj7
2
none of these solutions worked.
Jan 24 '18 #6
canaj7
2
I get "Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site"
Jan 24 '18 #7
The solution for first Runtime,Saved my day :)
May 9 '19 #8

Sign in to post your reply or Sign up for a free account.

Similar topics

1
by: Roberts | last post by:
Hi, I managed to get the Java extension working on php 4.3.10 after following various bits of advice from http://www.thelinuxpimp.com/main/modules.php?op=modload&name=News&file=article&sid=419...
1
by: Harlin | last post by:
Has anyone had any success using py2exe with anything you've written using the Python .NET implementation? (This is the one from the Zope website -- not ActiveState). I seem to be having trouble...
0
by: Christophe | last post by:
hi, I work alone but still use VSS for de version feature.(Version 6.0d build 9848) When I load a project from the start page that is a VSS project, I can't open de option window in de tool menu...
8
by: Joakim Persson | last post by:
Hello all. I am involved in a project where we have a desire to improve our software testing tools, and I'm in charge of looking for solutions regarding the logging of our software (originating...
28
by: liorm | last post by:
Hi everyone, I need to write a web app, that will support millions of user accounts, template-based user pages and files upload. The client is going to be written in Flash. I wondered if I coudl...
29
by: 63q2o4i02 | last post by:
Hi, I'm interested in using python to start writing a CAD program for electrical design. I just got done reading Steven Rubin's book, I've used "real" EDA tools, and I have an MSEE, so I know what...
3
by: Joost | last post by:
Hi guys, I have couple of simple python based active server pages that make use of httplib2 which uses gzip.py. IIS, however, also has a gzip.dll located at the iis/inetsrv path. When using ASP...
34
by: Anthony Irwin | last post by:
Hi All, I am currently trying to decide between using python or java and have a few quick questions about python that you may be able to help with. #1 Does python have something like javas...
1
by: TP | last post by:
Hi everybody, All my problem is in the title. If I try: $ python -c 'print "foo",' It does not change anything, surely because the line return is added by "python -c".
0
by: Venky K Shankar | last post by:
On Sunday 20 July 2008 12:08:49 am Lamonte Harris wrote: you can execute OS system call. here i execute ps -ef and grep the required process name (or you can grep by pid on that particular...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.