From: Samuele P. <ped...@bl...> - 2003-07-17 21:50:34
|
At 16:07 17.07.2003 -0400, Updike, Clark wrote: >You are correct. The javadoc for PySystemState's add_XXX methods state >this (see add_classdir): > >http://www.jython.org/docs/javadoc/org/python/core/PySystemState.html > >They work as advertised inside Tomcat. yup, they (add_*) are about collecting information whether x.y.z is a (existing) package and about contained classes, they don't instantiate classloaders. >As for another approach, you can manually append to the jvm's classpath >via java.lang.System.setProperty(): > > // from a static context > System.setProperty("java.class.path", > System.getProperty("java.class.path") + > System.getProperty("path.separator") + > "c:\\mydir"); > changing java.class.path after the fact does not work. >Then, programmatically append to the jython sys path: > > PySystemState sys = new PySystemState(); > > sys.path.append(new PyString("c:\\mydir")); this alone should work, jython will look for packages and classes in that directory and use Jython SyspathJavaLoader, a classloader created by Jython for the purpose of loading classes from sys.path . The latter at the moment (2.1) is a singleton, that means that if you expect the classes in mydir to change from time to time at runtime and to pick up the changes, then a more sophisticated approach is needed. [even if changing java.class.path would have worked then one of the above would still be redundant, classes found on java.class.path have precedence over classes from sys.path] >Create the interpreter using the sys instance: > > PythonInterpreter interp = new PythonInterpreter(null, sys); > >And you should be able to load classes from packages under mydir >the standard way. > If you can't programatically alter the jvm's >classpath (SecurityManager issue, considered bad form, whatever), see above, but the second part does not depend anyway on the ability to change java.class.path. >I think you'll have to do your own classloader. But Samuele Pedroni >might know something else to try. if you need to support "reloading" of classes then things are more complex. Sidenote: if your scripts subclass Java classes: class P(JavaClass): ... potentianlly an unbound number of times during the whole program lifetime, you may want to set python.options.internalTablesImpl = weak. regards. |
From: Samuele P. <ped...@bl...> - 2003-07-18 02:05:42
|
At 21:07 17.07.2003 -0400, Updike, Clark wrote: > >> As for another approach, you can manually append to the jvm's classpath > >> via java.lang.System.setProperty(): > >> > >> // from a static context > >> System.setProperty("java.class.path", > >> System.getProperty("java.class.path") + > >> System.getProperty("path.separator") + > >> "c:\\mydir"); > >> > > > > changing java.class.path after the fact does not work. > >Indeed. I thought maybe it would at least affect newly instantiated >class loaders but it doesn't even appear to affect that. Which >makes me wonder why it is mutable at all. I would not read too much into that, even java.vendor is mutable <wink>. I have not tried and I don't remember about pre 1.2 java. But with >=1.2 java an application classloader is setup to access java.class.path classes at startup and access to them from other classloaders is through parent classloader delegation mechanism. Poking around a bit: Jython 2.2a0 on java1.4.0_02 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> from org.python.core import Py >>> Py.getClassLoader() sun.misc.Launcher$AppClassLoader@2f6684 >>> cl=_ >>> cl.__class__ <jclass sun.misc.Launcher.AppClassLoader at 10696290> >>> cl.__class__.__bases__ (<jclass java.net.URLClassLoader at 11102307>,) >>> cl.getURLs() array([file:/D:/wsjy/jython/bin/, file:/D:/], java.net.URL) >>> from java.lang import System as Sys >>> Sys.getProperty("java.class.path") 'd:\\wsjy\\jython\\bin;' >>> it seems just a URLClassLoader subclass instance initialized with classpath contents. regards. |