Compiling Python Source to Real Java Classes
The previous section describes how Python classes can be created that subclass from Java classes. This works very well when you want to pass a Python class into Java from Jython. This is not adequate for building real Java ".class" files that implement a Java class and can be passed directly to Java programs. This sort of functionality is required to build applets, servlets, or JavaBeans in Jython that can be used exactly like their Java equivalents. It is also very valuable for users who wish to subclass Python classes in Java.
In order to build a real java class from a Python class, you will use the jythonc tool. A script called "jythonc" should have been installed in the Jython installation directory when you installed the package. If it was not, it can be invoked as follows: "jython Tools\jythonc\jythonc.py".
The jythonc tool generates actual Java source code, and then invokes a Java compiler over this source code to create the .class files. Thus, you will need access to a Java compiler in order to use jythonc. It is recommended that you use Sun's standard javac compiler, or IBM's excellent jikes compiler. Specifically, the Microsoft SDK jvc compiler is not recommended.
Invoke jythonc like this:
jythonc [options] [module]*
Options are given in the table below. Note that jythonc now uses the standard Python getopt module, meaning that both long and short forms of the options are available. The old option names still work, and are described below, but noted as deprecated and will be removed in a future version.
In order to create real java class, the Python module must contain a Python class with the same name as the module, and that Python class must subclass exactly one Java class or interface. The real Java class created will be a subclass of whatever Java class is subclassed.
Compiling python methods to java methodsNormally, compiled python methods are not directly callable from java. There is simple not sufficient information in a python method definition to create a useable java method. There are however two ways a python method be made into real java method. Both ways require that the python class have a java class or a java interface as its base classes.
On my Windows NT machine, I used the following command to create the file appletdemo.jar (containing all of the applet demos on the web site, as well as the core Jython libraries):
c:\jython\Demo\applet> jythonc --core --deep --jar appletdemo.jar *.py
Note: One special thing to consider when building applets is the java VM version used when compiling the sources must usually be the same as the VM version used by the browser. If a newer JVM is used when compiling the applets, the compiled code may have references to classes that does not exists in older JVM's.
To generate a skeleton class to allow a Python class to be used as java.awt.Component in a Java gui program, I used the following command:
c:\jython\Demo\javaclasses> jythonc Graph.py
To generate a Jython-based bean I do the following:
c:\jython\Demo\bean> jythonc --deep --bean f2c.jar conversion.FahrenheitToCelsius
To use this with SUN's BDK, I do the following (the important steps are to make the bean and the Jython libraries known to the tool).
You should now be able to access the FahrenheitToCelsius bean from SUN's BeanBox (or other Bean-aware tool).
Freezing modulesjythonc can also be used to freeze a python application. The frozen application can then be distributed and deployed as any other java application.
Some diffrences between an interpreted application and a frozen application exists: