如何在 C++ 中列出 Python 模块的所有函数名称?

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

我有一个 C++ 程序,我想导入一个 Python 模块并列出该模块中的所有函数名称。我该怎么做?

我使用以下代码从模块中获取字典:

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

但是如何列出函数名称?

出于好奇,我试图弄清楚这个问题。

首先,一个最小的 Python 模块 testModule.py:

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

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

其次,用于加载和评估 testModule:

的最小 C++ 示例 testPyModule.cc
// 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();
}

输出:

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

备注:

为了解决这个问题,我不得不仔细阅读文档。页。这些是我使用的页面的链接:

很明显,我没有检查 NULL(或 nullptr)的任何指针以保持示例简短紧凑。当然,生产代码应该这样做。