Hello,
I was trying to freeze (actually web/servlet-ize, but that's besides the =
point) my Jython application, and failed - I must be doing something =
totally wrong. :-(.
Here's a short failure scenario:
-- module Main.py in root/current package --
# commented -- from amod.A import A
from bmod.B import B
B().bfunc()
-- end Main.py --
-- module A.py in package/directory apkg --
class A:
def afunc(self):
return "kermits"
-- end A.py --
-- module B.py in package/directory bpkg --
from apkg.A import A
class B:
def bfunc(self):
print A().afunc()
-- end B.py --
I also have 2 empty __init__.py files (one for apkg, the other for =
bpkg).
Now, "jython Main.py" works just fine ("kermits" is printed).
Here's the output from "jythonc --deep" at compile time:
-- start --
E:\projects\jytest\2>jythonc --deep Main.py
processing Main
processing bpkg.B
processing apkg.A
processing bpkg.__init__
Required packages:
Creating adapters:
Creating .java files:
B module
Main module
__init__ module
A module
Compiling .java to .class...
Compiling with args: ['E:\\programming\\java\\jdk1.3\\bin\\javac.exe', =
'-classpa
th', '"E:\\programming\\jython\\jython.jar;E:\\program =
files\\borland\\Interclie
nt\\interclient.jar;E:\\programming\\jython\\jython.jar;E:\\programming\\=
java\\j
2sdkee1.3\\lib\\j2ee.jar;E:\\programming\\java\\jakarta-tomcat-3.2.1\\jyt=
est\\WE
B-INF\\classes;.;.\\jpywork;;E:\\programming\\jython\\Tools\\jythonc;E:\\=
project
s\\jytest\\2\\.;E:\\programming\\jython\\Lib;e:\\programming\\Jython\\Lib=
;E:\\pr
ogramming\\jython"', '.\\jpywork\\bpkg\\B.java', =
'.\\jpywork\\Main.java', '.\\jp
ywork\\bpkg\\__init__.java', '.\\jpywork\\apkg\\A.java']
0 Note: Some input files use or override a deprecated API.
Note: Recompile with -deprecation for details.
-- end --
Next, we go to "./jpywork" and do a "java Main" and get:
-- start --
Java Traceback:
at org.python.core.Py.ImportError(Py.java:180)
at org.python.core.imp.load(imp.java:384)
at org.python.core.imp.load(imp.java:392)
at org.python.core.imp.importName(imp.java:448)
at org.python.core.imp.importName(imp.java:528)
at org.python.core.ImportFunction.load(__builtin__.java:989)
at org.python.core.ImportFunction.__call__(__builtin__.java:982)
at org.python.core.PyObject.__call__(PyObject.java:252)
at org.python.core.__builtin__.__import__(__builtin__.java:942)
at org.python.core.imp.importFromAs(imp.java:586)
at bpkg.B$_PyInner.main$3(B.java:54)
at bpkg.B$_PyInner.call_function(B.java:36)
at org.python.core.PyTableCode.call(PyTableCode.java:198)
at org.python.core.PyCode.call(PyCode.java:13)
at org.python.core.imp.createFromCode(imp.java:165)
at org.python.core.imp.createFromClass(imp.java:186)
at org.python.core.imp.loadPrecompiled(imp.java:258)
at org.python.core.imp.loadFromPath(imp.java:269)
at org.python.core.PyModule.impAttr(PyModule.java:39)
at org.python.core.imp.dottedFind(imp.java:428)
at org.python.core.imp.importName(imp.java:452)
at org.python.core.imp.importName(imp.java:528)
at org.python.core.ImportFunction.load(__builtin__.java:989)
at org.python.core.ImportFunction.__call__(__builtin__.java:982)
at org.python.core.PyObject.__call__(PyObject.java:252)
at org.python.core.__builtin__.__import__(__builtin__.java:942)
at org.python.core.imp.importFromAs(imp.java:586)
at Main$_PyInner.main$1(Main.java:34)
at Main$_PyInner.call_function(Main.java:26)
at org.python.core.PyTableCode.call(PyTableCode.java:198)
at org.python.core.PyCode.call(PyCode.java:13)
at org.python.core.imp.createFromCode(imp.java:165)
at org.python.core.Py.runMain(Py.java:818)
at Main.main(Main.java:49)
Traceback (innermost last):
File "E:\projects\jytest\2\Main.py", line 0, in main
File "E:\projects\jytest\2\bpkg\B.py", line 0, in main
ImportError: no module named apkg
-- end --
Taking a look at the ./jpywork directory shows that __init__-s (.java, =
.class and $_PyInner.class) have only been compiled for bpkg, but not =
for apkg.
I tried passing it multiple arguments to compile, but it then compiled =
it to a different "package level".
Now, if we uncomment the first line in Main.py to also "from apkg.A =
import A" it works just fine (but importing all modules from the main =
application seems an ugly hack).
Any comments will be very appreciated.
Best regards,
Juris.
|