Just found out why I can't use PythonInterp shared amongst RuleSet. While the imports are shared and some of the functions each condition/consequence has its own variables passed as locals and no mangling or sharing should occur; hence why we were using Py.runCode(PyCode code, PyObject locals, PyObject globals)  - All variables are passed via a dict andthe locals parameter.

Mark
Mark Proctor wrote:
Just tried that, needed to be wrapped in a function otherwise it errors. Gonna get the shared interp thing working.

Mark
Mark Proctor wrote:
just chatting to one of the other developers, think we might be able to have a PythonInterpretor for each RuleSet, which should solve this issue. Otherwise whats potentially wrong with doing an exec with the following to emulate an expression:
        String tempText = stripOuterIndention( text );
        if (type.equals("eval"))
        {
            tempText = "return (" + tempText + ")";
        }
        this.text = newText.append(tempText).toString();


Mark
Oti wrote:
IMHO you cannot eval an import statement:
  Jython 2.1 on java1.4.2_05 (JIT: null)
  Type "copyright", "credits" or "license" for more information.
  >>> exec("from java.lang import String")
  >>> eval("from java.lang import String")
  Traceback (innermost last):
    File "<console>", line 1, in ?
    File "<string>", line 1  
  	from java.lang import String
	^
  SyntaxError: invalid syntax
  >>> 

so you have to exec the imports first, e.g. like Jim suggested.

Best wishes,
Oti.

--- Jim Adrig <jim@trampolining.com> wrote:

  
If you are running these from Java, maybe something like what we do 
will work?

First we 'add_package' since we have the cachedir stuff turned off:

   // for Swing GUI building:
     PySystemState.add_package("javax");
     PySystemState.add_package("javax.swing");
     PySystemState.add_package("javax.swing.text");
     PySystemState.add_package("java.awt");         // Color, etc.
     PySystemState.add_package("java.awt.event");

Then create an interpreter and 'execfile' all our standard 
imports/functions

	  python.execfile( functionFileStream, functionFileName ); // pass
the 
name for parsing errors

The 'functionFileStream' contains lots of things like:

   from javax.swing import JCheckBox, JComboBox, JFrame, JMenuBar, 
JMenu, JMenuItem, JTable, JButton, JOptionPane, JRadioButton, 
JTextField
   from java.awt import Color, GridLayout, GridBagLayout


On Oct 21, 2004, at 12:45 PM, Mark Proctor wrote:

    
I'm compiling expressions and blocks for use in our application, to
      
this we pre-append import statements declared elsewhere. It works
      
fine 
    
when type is "exec" for blocks but fails when its "eval" for 
expressions. Any ideas of how to get this to work?

Mark

   protected Interp(String text, Imports imports, String type)
   {
       this.origininalText = text;
       StringBuffer newText = new StringBuffer();

       if ((imports != null)&&(imports.getImportEntries() != null))
       {
           Iterator it =imports.getImportEntries().iterator();
                     while (it.hasNext())
           {                              ImportEntry importEntry =
      
(ImportEntry) it.next();
               if (importEntry instanceof PythonImportEntry)
               {
                   newText.append(importEntry.getImportEntry());
                   newText.append(";");
                   newText.append(newline);
               }
           }                         }
                            this.text = 
newText.append(stripOuterIndention( text )).toString();

       this.node = ( modType ) parser.parse( this.text, type );
       this.code = Py.compile( this.node, "<jython>" );