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