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 <[EMAIL PROTECTED]> wrote: > En Wed, 09 Apr 2008 13:31:22 -0300, Patrick Stinson > <[EMAIL PROTECTED]> 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/
-- http://mail.python.org/mailman/listinfo/python-list