Import and use standard Python module from inside Python C extension
Asked Answered
N

2

6

I have Python extension module written in C. I want to use in this C code one of the standard Python modules, for example os or shutil. How is best to do this?

Nalepka answered 11/2, 2012 at 4:39 Comment(0)
S
9
PyObject* os = PyImport_ImportModuleNoBlock("os");
if (os == NULL)
  return NULL;
someattr = PyObject_GetAttrString(os, "someattr");
Py_DECREF(os);

If you import the module only once e.g., in init_yourmodule() function then use PyImport_ImportModule("os").

Stansbury answered 11/2, 2012 at 18:7 Comment(2)
The function PyImport_ImportModuleNoBlock is now deprecatedPsycholinguistics
@user yes. Now both functions are the same.Stansbury
S
2

Don't.

Instead, change your extension module so that it provides a service to Python, and then write Python code which calls os, shutil and your module.

In fact, for a lot of the content in the os module it is probably better to write native C code rather than call into Python.

Of course, you can call Python modules from C code, it's just that doing that is overkill for low level modules like os and shutil. When it comes to the file copying methods in shutil reimplementing them in your C code is trivial. In fact, on Windows, copying a file is done by a call to the OS so there is not much code to even write in C.

If the Python module is written in C you could even just copy the code for the methods that you need.

Sleeping answered 11/2, 2012 at 4:46 Comment(1)
Complex extension modules sometimes need to do stuff that was already implemented in stdlib. It's a shame to reimplement them in C, or to restructure the codeNalepka

© 2022 - 2024 — McMap. All rights reserved.