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