Hi Everyone
I found a difference between the way jython works when it is called from the command line and when it is called from a java program. Ive tried my best to explain it and get a workaround but all attempts have failed. I will appreciate any help.

 
What I want to do is given a script string I want to find all the functions defined in the script.
Lets say the script fragment is as follows:
def foobar():
    print("foobar")

 
If I try this via the jython program, I get the following:

 
bash$ jython
Jython 2.2 on java1.5.0_11
Type "copyright", "credits" or "license" for more information.
>>> def foobar():
...     print("foobar")
... 
>>> this_module = __import__(__name__)
>>> print __name__
__main__
>>> for e in dir():
...     if (callable(getattr(this_module, e))):
...         print(e + " is callable")
... 
foobar is callable
>>> 

 
Notice that the __name__ shows up as __main__ and that foobar shows up as callable. So far so good.

 
Now if I try to do the same thing via java:

 
bash$ java Test2
Traceback (innermost last):
  File "<string>", line 4, in ?
ImportError: no module named main
Name was main

Now why is the __name__ set to main? I even tried hardcoding the __import__ to call __import__('__main__'). It couldnt find that module either.
Any ideas on how I can get this to work? Any help would be greatly appreciated.

 
Here is the java code:
import org.python.util.PythonInterpreter ;
import org.python.core.*;

 
public class Test2 {

 
        public static void main(String[] args) throws Exception {
                PythonInterpreter interp = new PythonInterpreter();
                interp.setErr(System.err);
                interp.setOut(System.out);
                String s = "def foobar():\n" +
                           "    print(\"foobar\")\n" +
                           "name=__name__\n" +
                           "this_module = __import__(__name__)\n" +
                           "for e in dir():\n" +
                           "    if (callable(getattr(this_module, e))):\n" +
                           "        print(e + \" is callable\")\n";

 
                try {
                        interp.exec(s);
                } catch (PyException e) {
                        e.printStackTrace ();
                }
                System.out.println("Name was " + interp.get("name"));
        }
}

 
Thanks a lot in advance and apologies if I missed an FAQ that covers this. I did try to do my research before posting this.
Thanks
Balaji