From: Mike H. <th...@bi...> - 2002-11-26 19:51:04
|
I'm trying to take a simple Jython script and put it into a jar file. I can *do* that, but I don't know how to access my script after that. I only have one function in the file: def evenJob(jobData): if not jobData: return None elif (jobData.jobId.getID()%2 == 0) : return 1 else: return None This function is in a class very wittingly called "evenjob.py". So I use jythonc to put it in a jar file with package name "com.workpoint.qa.python": jythonc --jar jythonqa.jar -p "com.workpoint.qa.python" evenjob.py And I have it in a jar, but I don't know how to access my evenJob function. Example (from Jython): mikeh@tardis embed_jython $ jython Jython 2.1 on java1.4.1_01 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append("jythonqa.jar") >>> from com.workpoint.qa.python import evenjob >>> evenjob.evenJob Traceback (innermost last): File "<console>", line 1, in ? AttributeError: class 'com.workpoint.qa.python.evenjob' has no attribute 'evenJob' >>> -- |
From: Mike H. <th...@bi...> - 2002-11-26 19:57:45
|
On Tue, Nov 26, 2002 at 01:51:01PM -0600, Mike Hostetler wrote: > > I'm trying to take a simple Jython script and put it into a jar file. I > can *do* that, but I don't know how to access my script after that. > > I only have one function in the file: > > def evenJob(jobData): > if not jobData: > return None > elif (jobData.jobId.getID()%2 == 0) : > return 1 > else: > return None > > This function is in a class very wittingly called "evenjob.py". oops. I mean a file called "evenjob.py" > So I use jythonc to put it in a jar file with package name "com.workpoint.qa.python": > jythonc --jar jythonqa.jar -p "com.workpoint.qa.python" evenjob.py > > And I have it in a jar, but I don't know how to access my evenJob > function. Example (from Jython): > > mikeh@tardis embed_jython $ jython > Jython 2.1 on java1.4.1_01 (JIT: null) > Type "copyright", "credits" or "license" for more information. > >>> import sys > >>> sys.path.append("jythonqa.jar") > >>> from com.workpoint.qa.python import evenjob > >>> evenjob.evenJob > Traceback (innermost last): > File "<console>", line 1, in ? > AttributeError: class 'com.workpoint.qa.python.evenjob' has no attribute > 'evenJob' > >>> > > -- > > > ------------------------------------------------------- > This SF.net email is sponsored by: Get the new Palm Tungsten T > handheld. Power & Color in a compact size! > http://ads.sourceforge.net/cgi-bin/redirect.pl?palm0002en > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users -- |
From: Daniel L. <dm...@ya...> - 2002-11-27 01:24:01
|
Here is what I do: Suppose I have the following class 'bar' in package 'foo': package foo; public class bar { public bar() { System.out.println("foo.bar::ctor()"); } public void baz() { System.out.println("foo.bar::baz()"); } } This is how I call it: import jreload X=jreload.makeLoadSet('X',['foo.jar']) from X.foo import bar bar() bar().baz() RESULT: [anduril:Notebook/UsingJarFiles/example1] daniello% jython load2.py foo.bar::ctor() # call to bar() foo.bar::ctor() # call to bar().baz() foo.bar::baz() # ditto previous line # Nota bene: the 'X' is an arbitrary name--call it what you like: Jar1, etc., etc. # Also, notice the need to call the bar constructor BEFORE calling baz() as in bar().baz(). # Calling bar.baz() will generate an error. This is because I did not instantiate bar before # the call to baz as in: # myBar = bar() # myBar.baz() Cheers, Daniel -- daniellordATtelocityDOTcom "My dancing, drinking, and singing weave me the mat GPG Fingerprint: C59E 59F5 1C63 5CFB 6161 067E FF00 A4E8 684A 16BB upon which my soul will sleep in the world of spirits" -- Old Man of Halmahera, Indonesia On Tuesday, Nov 26, 2002, at 11:57 US/Pacific, Mike Hostetler wrote: > On Tue, Nov 26, 2002 at 01:51:01PM -0600, Mike Hostetler wrote: >> >> I'm trying to take a simple Jython script and put it into a jar file. >> I >> can *do* that, but I don't know how to access my script after that. >> >> I only have one function in the file: >> >> def evenJob(jobData): >> if not jobData: >> return None >> elif (jobData.jobId.getID()%2 == 0) : >> return 1 >> else: >> return None >> >> This function is in a class very wittingly called "evenjob.py". > > oops. I mean a file called "evenjob.py" > >> So I use jythonc to put it in a jar file with package name >> "com.workpoint.qa.python": >> jythonc --jar jythonqa.jar -p "com.workpoint.qa.python" evenjob.py >> >> And I have it in a jar, but I don't know how to access my evenJob >> function. Example (from Jython): >> >> mikeh@tardis embed_jython $ jython >> Jython 2.1 on java1.4.1_01 (JIT: null) >> Type "copyright", "credits" or "license" for more information. >>>>> import sys >>>>> sys.path.append("jythonqa.jar") >>>>> from com.workpoint.qa.python import evenjob >>>>> evenjob.evenJob >> Traceback (innermost last): >> File "<console>", line 1, in ? >> AttributeError: class 'com.workpoint.qa.python.evenjob' has no >> attribute >> 'evenJob' |
From: Matt P. <Payne@MattPayne.org> - 2002-12-02 02:49:45
|
Quoting Mike Hostetler <th...@bi...>: > > I'm trying to take a simple Jython script and put it into a jar file. I > can *do* that, but I don't know how to access my script after that. > Mike - This is a great question. I have trouble with this stuff. I want to get good at mixing jython & java. This is a cool example.... Doesn't a jython function have to be inside of a class before jythonc can be used? I think the fundamental problem is I'm not able to make EvenJobClass.py have a public default constructor when I compile it with jythonc. What am I doing wrong? Please read on for the things I tried... -Matt I don't have an answer but here's what I tried.... 1) I made a simplified version of your script: import java class EvenJobClass(java.lang.Object): def __init__(self): "@sig public EvenJobClass()" self.data=42 # for fun... def evenJob(self,x): "@sig public int evenJob(int x)" if (x % 2) == 0: return 1 else: return 0 2) I tested it from interactive jython w/ the EvenJobClass.py in the current directory. >>> import EvenJobClass >>> e=EvenJobClass.EvenJobClass() >>> e.evenJob(4) 1 >>> 3) Use jythonc like you did: bash-2.05$ !jythonc jythonc --jar jythonqa.jar -p "com.workpoint.qa.python" EvenJobClass.py processing EvenJobClass Required packages: java.lang Creating adapters: Creating .java files: EvenJobClass module EvenJobClass extends java.lang.Object Compiling .java to .class... Compiling with args: ['/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Home/bin/javac', '-classpath', '/Users/payne/jython-2.1/jython.jar::./jpywork::/Users/payne/jython-2.1/Tools/jythonc:/Users/payne/jython/mike/.:/Users/payne/jython-2.1/Lib', './jpywork/com/workpoint/qa/python/EvenJobClass.java'] 0 Note: ./jpywork/com/workpoint/qa/python/EvenJobClass.java uses or overrides a deprecated API. Note: Recompile with -deprecation for details. Building archive: jythonqa.jar Tracking java dependencies: bash-2.05$ 4) Try to use the jythonqa.jar file from jython (like you did): bash-2.05$ jython Jython 2.1 on java1.3.1 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append("jythonqa.jar") >>> from com.workpoint.qa.python import EvenJobClass >>> e=EvenJobClass() >>> e com.workpoint.qa.python.EvenJobClass@4b9237 >>> dir(e) [] >>> e.evenJob(4) Traceback (innermost last): File "<console>", line 1, in ? AttributeError: abstract method "evenJob" not implemented >>> dir(EvenJobClass) ['__initProxy__', '__init__', '__supernames__', 'classDictInit', 'clone', 'evenJob', 'finalize', 'main', 'moduleDictInit'] >>> I'm confused as to why dir(e) returns an empty list??? www.jarspy.org shows that EvenJobClass has these methods: public static void moduleDictInit(org.python.core.PyObject) public static void main(java.lang.String[]) public int evenJob(int) public java.lang.Object clone() public void finalize() public void <init>() public void _setPyInstance(org.python.core.PyInstance) public org.python.core.PyInstance _getPyInstance() public void _setPySystemState(org.python.core.PySystemState) public org.python.core.PySystemState _getPySystemState() public void __initProxy__(java.lang.Object[]) public static void classDictInit(org.python.core.PyObject) static java.lang.Class class$(java.lang.String) static void <clinit>() This is very confusing because I put an @sig docstring in so there would be a public default constructor for EvenJobClass. --------- A "plain python" approach is to put EvenJobClass into a com/workpoint/qa/python directory tree with a __init__.py marker in each directory.... bash-2.05$ mkdir -p com/workpoint/qa/python bash-2.05$ touch com/__init__.py bash-2.05$ cp com/__init__.py com/workpoint bash-2.05$ cp com/__init__.py com/workpoint/qa bash-2.05$ cp com/__init__.py com/workpoint/qa/python bash-2.05$ mv EvenJobClass.py com/workpoint/qa/python bash-2.05$ jython Jython 2.1 on java1.3.1 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/Users/payne/jython/mike/.', '/Users/payne/jython-2.1/Lib'] >>> print "Ooooh! Default should work...." Ooooh! Default should work.... >>> from com.workpoint.qa.python import EvenJobClass >>> e=EvenJobClass() Traceback (innermost last): File "<console>", line 1, in ? TypeError: call of non-function (module 'com.workpoint.qa.python.EvenJobClass') >>> print "What was wrong with that!? ugh." What was wrong with that!? ugh. >>> import com.workpoint.qa.python.EvenJobClass as EvenJobClass >>> e=EvenJobClass() Traceback (innermost last): File "<console>", line 1, in ? TypeError: call of non-function (module 'com.workpoint.qa.python.EvenJobClass') >>> dir(EvenJobClass) ['EvenJobClass', '__doc__', '__file__', '__name__', 'java'] >>> e=EvenJobClass.EvenJobClass() # How can I avoid this ugly? >>> dir(e) ['data'] >>> e.evenJob(4) 1 >>> Why did the method evenJob not show up in dir(e)?? When I try to do the same thing using jythonqa.jar instead of the python way it gets an error similar to the one from your original post.... bash-2.05$ mv com broke # to get rid of the "python way" bash-2.05$ jython Jython 2.1 on java1.3.1 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append("jythonqa.jar") >>> from com.workpoint.qa.python import EvenJobClass >>> e=EvenJobClass.EvenJobClass() Traceback (innermost last): File "<console>", line 1, in ? AttributeError: class 'com.workpoint.qa.python.EvenJobClass' has no attribute 'EvenJobClass' >>> > I only have one function in the file: > > def evenJob(jobData): > if not jobData: > return None > elif (jobData.jobId.getID()%2 == 0) : > return 1 > else: > return None > > This function is in a class very wittingly called "evenjob.py". > > So I use jythonc to put it in a jar file with package name > "com.workpoint.qa.python": > jythonc --jar jythonqa.jar -p "com.workpoint.qa.python" evenjob.py > > And I have it in a jar, but I don't know how to access my evenJob > function. Example (from Jython): > > mikeh@tardis embed_jython $ jython > Jython 2.1 on java1.4.1_01 (JIT: null) > Type "copyright", "credits" or "license" for more information. > >>> import sys > >>> sys.path.append("jythonqa.jar") > >>> from com.workpoint.qa.python import evenjob > >>> evenjob.evenJob > Traceback (innermost last): > File "<console>", line 1, in ? > AttributeError: class 'com.workpoint.qa.python.evenjob' has no attribute > 'evenJob' > >>> > > -- |
From: Mike H. <th...@bi...> - 2002-12-02 14:57:47
|
On Sun, Dec 01, 2002 at 08:49:32PM -0600, Matt Payne wrote: > Quoting Mike Hostetler <th...@bi...>: > > > > > I'm trying to take a simple Jython script and put it into a jar file. I > > can *do* that, but I don't know how to access my script after that. > > > > Mike - This is a great question. I have trouble with this stuff. > > I want to get good at mixing jython & java. This is a cool example.... > > Doesn't a jython function have to be inside of a class before jythonc can be used? I didn't know that, but you are probably right. > > I think the fundamental problem is I'm not able to make EvenJobClass.py have a > public default constructor when I compile it with jythonc. What am I doing wrong? [snip] I dunno what you did wrong, but it gave me some ideas, and I had a little success. Instead of compiling it straight to a jar, I decided to just compile it to a class via: jythonc -p "com.workpoint.qa.python" EvenJobClass.py I got a EvenJobClass.class and EvenJobClass$_PyInner.class file in the jpywork directory With that, I'm able to import: Jython 2.1 on java1.4.1_01 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append("EvenJobClass.class") >>> e = EvenJobClass.EvenJobClass() Traceback (innermost last): File "<console>", line 1, in ? NameError: EvenJobClass >>> import EvenJobClass >>> e = EvenJobClass.EvenJobClass() >>> e.data 42 >>> e.evenJob(4) 1 >>> So I jar'ed up my com/workpoint/qa/python directory manually: mikeh@tardis java $ jar cvf javaqa.jar com/workpoint/ added manifest adding: com/workpoint/(in = 0) (out= 0)(stored 0%) adding: com/workpoint/qa/(in = 0) (out= 0)(stored 0%) adding: com/workpoint/qa/JavaInsteadOfScript.java(in = 28194) (out= 4459)(deflated 84%) adding: com/workpoint/qa/JavaInsteadOfScript.class(in = 8266) (out= 3923)(deflated 52%) adding: com/workpoint/qa/python/(in = 0) (out= 0)(stored 0%) adding: com/workpoint/qa/python/EvenJobClass.py(in = 240) (out= 153)(deflated 36%) adding: com/workpoint/qa/python/EvenJobClass$py.class(in = 3343) (out= 1520)(deflated 54%) adding: com/workpoint/qa/python/EvenJobClass$_PyInner.class(in = 4055) (out= 1894)(deflated 53%) adding: com/workpoint/qa/python/EvenJobClass.class(in = 3953) (out= 1709)(deflated 56%) And, doing that, got some stranger results importing the jar: Jython 2.1 on java1.4.1_01 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append("java/javaqa.jar") >>> from com.workpoint.qa.python import EvenJobClass >>> e = EvenJobClass.EvenJobClass() Traceback (innermost last): File "<console>", line 1, in ? AttributeError: class 'com.workpoint.qa.python.EvenJobClass' has no attribute 'EvenJobClass' >>> dir(EvenJobClass) ['__initProxy__', '__supernames__', 'classDictInit', 'clone', 'evenJob', 'finalize', 'main', 'moduleDictInit'] >>> EvenJobClass.evenJob(4) Traceback (innermost last): File "<console>", line 1, in ? TypeError: evenJob(): expected 2 args; got 1 >>> e = EvenJobClass() >>> e.evenJob(4) Traceback (innermost last): File "<console>", line 1, in ? AttributeError: abstract method "evenJob" not implemented >>> EvenJobClass.evenJob(e,4) Traceback (innermost last): File "<console>", line 1, in ? AttributeError: abstract method "evenJob" not implemented So, now I can see the "evenJob" method, but I can't use it. A quick Google of this search brings up some past discussion/bugs about this: http://216.239.53.100/search?q=cache:1P6cREeFChUC:www.geocrawler.com/archives/3/7018/2000/11/0/4688800/+jython+AttributeError:+abstract+method+not+implemented&hl=en&ie=UTF-8 but it seems weird that the class file works, and not the jar file. -- mikeh |