12

I know it's something silly, but for some reason Jython refuses to find javax.swing. I'm using Java 1.6.0_11. This is my start-up script:

@echo off "%JAVA_HOME%\bin\java" -Xmx1024M -classpath ".;c:\Projects\Jython2.5.1\jython.jar" org.python.util.jython 

My output looks like:

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) [Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10 Type "help", "copyright", "credits" or "license" for more information. >>> import javax.swing Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named swing >>> import javax >>> dir(javax) ['__name__'] >>> 
3
  • 3
    This is an extremely common question/problem. Any chance that you would change the title to "Why does Jython refuse to find my Java package?" that way more people will probably find this. Commented Nov 10, 2009 at 14:28
  • I changed the name -- you're right, this can happen to anyone. Commented Nov 10, 2009 at 19:14
  • Thanks for changing the name! Commented Dec 30, 2009 at 16:00

3 Answers 3

13

Most likely Jython is not scanning your packages. On startup, Jython tries to go through the jars and class files on its path and scan for Java packages. This is necessary because there is no way to look for Java packages by reflection. Package scanning can be deliberately turned off, or you could lack write privileges where it wants to write the cached information out see http://wiki.python.org/jython/PackageScanning for more. The best way to import Java classes is to do so explicitly class by class, like so:

from javax.swing import JFrame 

This method should always work, even if package scanning is off or otherwise unable to work, and is the recommended approach (though it can be a bit tedious). If you do want to import packages (or if you want to do "from javax.swing import *" which also depends on package scanning - but is discouraged) you will need to figure out why your package scanning isn't working.

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

1 Comment

The "from package import object" thing worked. I'll figure out why the package scanning isn't working but at least I have something to go on. Thanks Frank! Keep up the great work!
12

I had similar issues, and it turns out that since the standalone Jython dist does not support caching, it also does not support the "import *" approach. This is not clearly documented anywhere in the official Jython docs, but I concluded this based on a number of different bug reports:

Notable from that last link:

So as Oti noted, in standalone you must do full imports to succeed.

To fix your issue, use the non-standalone standard jython.jar generated by installing jython using the 'Standard' option.

If you wanted to package and distribute jython.jar with your application, in case a user does not have Jython installed, then you will also need to copy/pase the complete "Lib" folder from the jython installation directory into whichever location you end up placing jython.jar. This enables access to the python stdlib which is not included in the standard jar file.

UPDATE: After playing around more, I think I have a fix to enable "import *" type imports even when using the standalone jar. All that needs to be done is to enable caching!

You can do this by either adding the following options to the jvm when running jython:

-Dpython.cachedir.skip=false -Dpython.cachedir=DESIRED CACHE PATH

(Note that the second argument is optional, and if left blank, a default value will be used)

If you are having an issue running the InteractiveConsole embedded in an app (which is what my problem was) you can add these properties before initializing the console:

 Properties props = new Properties(); props.put("python.cachedir.skip", "false"); props.put("python.cachedir", "DESIRED CACHE PATH"); // again, this option is optional InteractiveConsole.initialize(System.getProperties(), props, new String[0]); 

1 Comment

Is there anyway to modify the standalone jar so that python.cachedir.skip is set to false by default?
1

I'm using Java 1.6.0_11

No, you're using

[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10

What happens if you delete the cachedir from the Jython distribution directory, and try again?

Also, why are you explicitly setting the classpath that way? Why not simply

java -jar jython.jar 

?

2 Comments

I'm using the stand-alone Jython jar, which doesn't do caching. And I can't run this from -jar because I will eventually start adding other jars to the classpath.
you can enable caching even when using the standalone jar. See my answer in this thread.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.