Как перечислить все имена функций модуля Python в C ++? - PullRequest
6 голосов
/ 24 сентября 2019

У меня есть программа на C ++, я хочу импортировать модуль Python и перечислить все имена функций в этом модуле.Как я могу это сделать?

Я использовал следующий код, чтобы получить подсказку от модуля:

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

Но как перечислить имена функций?

1 Ответ

4 голосов
/ 24 сентября 2019

Из любопытства я попытался разгадать это.

Во-первых, минимальный модуль 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), чтобы образец был коротким и компактным.Производственный код должен делать это, конечно.

...