【问题标题】:How to list all function names of a Python module in C++?如何在 C++ 中列出 Python 模块的所有函数名称?
【发布时间】:2020-01-24 06:55:38
【问题描述】:

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

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

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

但是如何列出函数名称呢?

【问题讨论】:

  • 感谢您的回复,实际上我的请求是将一个 python 模块导入 C++ 并获取所有函数名称并将它们填充到一个组合框中,我可以选择要执行的函数,我不熟悉python CAPI,所以我不知道如何提取函数名,我找到了 PyModule_GetDict 函数但不知道如何迭代它

标签: python c++ python-c-api


【解决方案1】:

出于好奇,我试图解开这个谜题。

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

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

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

其次,一个最小的 C++ 示例testPyModule.cc 用于加载和评估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();
}

输出:

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

注意事项:

为了解决这个问题,我不得不深入研究文档。页。这些是我使用的页面的链接:

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

【讨论】:

  • 非常感谢,我从你的代码中学到了很多,这很有帮助,非常感谢
  • 即使除了错误检查之外,这也是非常不习惯的。 PyImport_ImportModulePyDict_Next 发生了什么?
  • @DavisHerring 可能是我挖得不够努力。我根据您的提示制作并检查了修改后的样品。感谢您的评论。
猜你喜欢
  • 2010-09-13
  • 2020-12-06
  • 2014-12-14
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多