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