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: [email protected]
> 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 - [email protected]
> http://mail.python.org/mailman/listinfo/pythondotnet
>
_________________________________________________
Python.NET mailing list - [email protected]
http://mail.python.org/mailman/listinfo/pythondotnet