PyImport_ImportModule, PyModule_GetDict
Michael P. Reilly
arcege at shore.net
Thu Jul 8 14:02:55 EDT 1999
Michael P. Reilly <arcege at shore.net> wrote:
: Randy Heiland <heiland at ncsa.uiuc.edu> wrote:
: : If I understand this correctly, the equivalent of doing this:
: :>>> import mymodule
: :>>> dir(mymodule)
: : is sort of this, in the C API:
: : PyObject *mod = PyImport_ImportModule("mymodule");
: : PyObject *myDict = PyModule_GetDict(mod);
: : Q: what is the C API equivalent of this:
: :>>> from mymodule import *
: :>>> dir()
Oops... forgot to initialize something. It compiled and worked, but
would only work without optimized compilation. :)
: You will have to do something a little more:
: PyObject *fromlist, *main, *globals;
: PyObject *sysmod, *sysdict, *key, *val;
: int pos; /* used internally by PyDict_Next() */
^^^^^^^^^^^^^^
int pos = 0;
: /* tell __import__ to return the top-level module */
: fromlist = Py_BuildValue("[s]", "*");
: main = PyImport_ImportModule("__main__");
: globals = PyModule_GetDict(main);
: /* ImportModuleEx handles "from package.module import *" as well */
: sysmod = PyImport_ImportModuleEx("sys", globals, globals, fromlist);
: sysdict = PyModule_GetDict(sysmod);
: /* perform standard name bindings */
: while (PyDict_Next(sysdict, &pos, &key, &val) > 0) {
: if (!PyString_Check(key) ||
: (PyString_AS_STRING(key)[0] != '_'))
: PyDict_SetItem(globals, key, val);
: }
: If you look at the documentation for __import__, it does not perform the
: name binding in the globals dictionary (for some reason ;), so that must
: be performed manually.
: -Arcege
More information about the Python-list
mailing list