problem using import from PyRun_String

Patrick Stinson patrickkidd.lists at gmail.com
Fri Apr 11 03:26:32 EDT 2008


Great, that was the answer I was looking for, thank you. I'll respond with
how well it works.

On Thu, Apr 10, 2008 at 12:16 AM, Gabriel Genellina <gagsl-py2 at yahoo.com.ar>
wrote:

> En Wed, 09 Apr 2008 13:31:22 -0300, Patrick Stinson
> <patrickkidd.lists at gmail.com> escribió:
>
> > Well, I eventually want to add an import hook, but for now I'd rather
> > just
> > get the import statement working normally again.
> > I have embedded python as a scripting engine in my application. To do
> > this,
> > I create a new empty module, run the script text using PyRun_String()
> > passing the module's __dict__ as locals and globals. This populates the
> > module's __dict__ with the resulting object references from the script
> > text.
>
> Instead of PyRun_String, use PyImport_ExecCodeModuleEx, which takes care
> of setting __builtins__ and other details.
> You will need to compile the source first (using Py_CompileStringFlags)
> which is a good thing anyway, to help catching errors.
>
> > As I said before I must be forgetting some other module init stuff
> > because I
> > had to manually populate the modules' __dict__ with references from the
> > __builtin__ module in order to get the basic stuff like abs, range, etc.
>
> That's not exactly what CPython does; if you inspect globals() you don't
> see abs, range, etc. Instead, there is a __builtins__ attribute (note the
> "s") that points to the __builtin__ module or its __dict__.
>
> > I understand what __builtin__ is used for, but the C struct pointing to
> > the
> > code frame that contains the import statement has a builtin member that
> > apparently does not contain the __import__ function, hence my question.
> > There must be some difference in the way code is parsed and a copy of
> the
> > __builtin__ module is passed normally and the way I am doing it.
>
> When a frame builtins != internal builtins, Python runs in "restricted
> execution mode", and disallows access to some objects and attributes, I
> think that __import__ is one of them.
> See http://docs.python.org/lib/module-rexec.html
> (That's why it's important to use the right way to create a module)
>
> > So, finding the place where this module bootstrapping normally happens
> > would
> > be awesome, because I sort of feel like I'm hacking this method running
> > into
> > problems like this.
>
> Exactly. The simplest way would be to save the source code on disk and
> just import it, letting Python do all the dirty work. But
> compiling+PyImport_ExecCodeModule should work, I presume - any feedback is
> welcome!
>
> --
> Gabriel Genellina
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
Patrick Kidd Stinson
http://www.patrickkidd.com/
http://pkaudio.sourceforge.net/
http://pksampler.sourceforge.net/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080411/8ed635c4/attachment-0001.html>


More information about the Python-list mailing list