Extending embedded Python: Adding single methods

Thomas Heller theller at python.net
Wed Mar 8 11:18:31 EST 2006


Torsten Bronger wrote:
> Hallöchen!
> 
> I'd like to script C++ funtions by an embedded Python interpreter.
> So far, my C++ main() function contains:
> 
>   Py_Initialize();
>   Py_InitModule("pp3", PythonMethods);
>   PyRun_SimpleString("from pp3 import *");
>   PyRun_AnyFile(stdin, NULL);
>   Py_Finalize();
> 
> "PythonMethods" is the vector of type PyMethodDef that contains the
> function descriptors:
> 
> static PyMethodDef PythonMethods[] = {
>   {"toll", py_toll, METH_VARARGS, ""},
>   {NULL, NULL, 0, NULL}
> };
> 
> Then I say "toll()" in the input script which calls py_toll() in the
> C++ source.
> 
> 
> It works.  However, is there a way to avoid this dummy "pp3" module
> and add the C++ functions directy to the main namespace in the
> Python script?

Yes.  You can import __builtin__, and add methods to it.
This is a snippet from the bdist_wininst code, which embeds Python:

http://svn.python.org/view/python/trunk/PC/bdist_wininst/install.c?rev=38414&view=markup

PyMethodDef meth[] = {
	{"create_shortcut", CreateShortcut, METH_VARARGS, NULL},
	{"get_special_folder_path", GetSpecialFolderPath, METH_VARARGS, NULL},
	{"get_root_hkey", (PyCFunction)GetRootHKey, METH_NOARGS, NULL},
	{"file_created", FileCreated, METH_VARARGS, NULL},
	{"directory_created", DirectoryCreated, METH_VARARGS, NULL},
	{"message_box", PyMessageBox, METH_VARARGS, NULL},
};


...
	mod = PyImport_ImportModule("__builtin__");
	if (mod) {
		int i;
		for (i = 0; i < DIM(meth); ++i) {
			PyObject_SetAttrString(mod, meth[i].ml_name,
					       PyCFunction_New(&meth[i], NULL));
		}
	}
...

Thomas




More information about the Python-list mailing list