How to list all function names of a Python module in C++?

倾然丶 夕夏残阳落幕 提交于 2021-01-27 04:43:09

问题


I have a C++ program, I want to import a Python module and list all function names in this module. How can I do it?

I used the following code to get the dict from a module:

PyDictObject* pDict = (PyDictObject*)PyModule_GetDict(pModule);

But how to list the functions names?


回答1:


Out of curiosity, I tried to puzzle this out.

First, a minimal Python module testModule.py:

def main():
  print("in test.main()")

def funcTest():
  print("in test.funcTest()")

Second, a minimal C++ sample testPyModule.cc to load and evaluate the testModule:

// standard C++ header:
#include <iostream>

// Python header:
#include <Python.h>

int main()
{
  // initialize Python interpreter
  Py_Initialize();
  // run script
  const char *const script =
    "# tweak sys path to make Python module of cwd locatable\n"
    "import sys\n"
    "sys.path.insert(0, \".\")\n";
  PyRun_SimpleString(script);
  // get module testModule
  PyObject *pModuleTest = PyImport_ImportModule("testModule"); // new reference
  // evaluate dictionary of testModule
  PyObject *const pDict = PyModule_GetDict(pModuleTest); // borrowed
  // find functions
  std::cout << "Functions of testModule:\n";
  PyObject *pKey = nullptr, *pValue = nullptr;
  for (Py_ssize_t i = 0; PyDict_Next(pDict, &i, &pKey, &pValue);) {
    const char *key = PyUnicode_AsUTF8(pKey);
    if (PyFunction_Check(pValue)) {
      std::cout << "function '" << key << "'\n";
    }
  }
  Py_DECREF(pModuleTest);
  // finalize Python interpreter
  Py_Finalize();
}

Output:

Functions of testModule:
function 'main'
function 'funcTest'

Notes:

To puzzle this out, I had to dig through the doc. pages. These are the links for the pages I used:

  • Importing Modules: PyImport_ImportModule
  • Module Objects: PyModule_GetDict()
  • Function Objects: PyFunction_Check()
  • Dictionary Objects: PyDict_Next()
  • Unicode Objects and Codecs: PyUnicode_AsUTF8().

It's obvious that I didn't check any pointer for NULL (or nullptr) to keep the sample short and compact. Production code should do this, of course.



来源:https://stackoverflow.com/questions/58075398/how-to-list-all-function-names-of-a-python-module-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!