Hi Michael - I assume you're running an older version of 
Python for NET? The current version has an implementation 
of RunString:

        public static PyObject RunString(string code) {
            IntPtr globals = Runtime.PyEval_GetGlobals();
            IntPtr locals = Runtime.PyDict_New();

            IntPtr builtins = Runtime.PyEval_GetBuiltins();
            Runtime.PyDict_SetItemString(locals, "__builtins__", builtins);

            IntPtr flag = (IntPtr)257; /* Py_file_input */
            IntPtr result = Runtime.PyRun_String(code, flag, globals, locals);
            Runtime.Decref(locals);
            if (result == IntPtr.Zero) {
                return null;
            }
            return new PyObject(result);
        }

The trick is that for various reasons you can't depend on the 
PyEval_GetLocals call to return anything meaningful, so you have 
to build the locals dict manually.

HTH,


Brian Lloyd        [EMAIL PROTECTED]
V.P. Engineering   540.361.1716              
Zope Corporation   http://www.zope.com 


> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of Michael Eddington
> Sent: Sunday, August 14, 2005 1:36 AM
> To: pythondotnet@python.org
> Subject: [Python.NET] Adding PyRun_String to Runtime
> 
> 
> I would like to run Python strings and get an object return from .NET.
>  To this end I added PyRun_String to the Runtime object and another
> method to PythonEngine ala the existing SimpleString implementation.
> 
> Everything compiles, but  Runtime.PyRun_String always returns a NULL,
> and it does not look like the code is being run.
> 
> Is there any trick to adding new methods to the Runtime?
> 
> // From Runtime.cs
> 
>       [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl,
>                  ExactSpelling=true, CharSet=CharSet.Ansi)]
>         internal unsafe static extern IntPtr
>         PyRun_String(string code, int start, IntPtr globals, 
> IntPtr locals);
>   
> 
> // From Python.cs
> 
>               public static PyObject RunString(string code)
>               {
>                       IntPtr globals = Runtime.PyEval_GetGlobals();
>                       IntPtr locals = Runtime.PyEval_GetLocals();
>                       IntPtr ret;
> 
>                       ret = Runtime.PyRun_String(code, 
> 257,globals, locals);
>                       
>                       Runtime.Decref(globals);
>                       Runtime.Decref(locals);
> 
>                       if (ret == IntPtr.Zero) 
>                       {
>                               throw new PythonException();
>                       }
> 
>                       return new PyObject(ret);
>               }
> _________________________________________________
> Python.NET mailing list - PythonDotNet@python.org
> http://mail.python.org/mailman/listinfo/pythondotnet
> 
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
http://mail.python.org/mailman/listinfo/pythondotnet

Reply via email to