无法从 Python C API 中内置的模块调用方法
Can't call a method from a module built in Python C API
我正在尝试使用 Python C API 在 C++ 中构建一个 python 模块,这是代码:
#include "Python.h"
#include <iostream>
class MyClass {
public:
MyClass() {};
static MyClass& getInstance() {
static MyClass instance;
return instance;
}
void tester() {
std::cout << "testing..." << std::endl;
}
static void runTesterFunc(PyObject*, PyObject*) {
static MyClass& myObj = MyClass::getInstance();
myObj.tester();
}
static PyObject* getModule() {
Py_SetPythonHome(L"C:\Python36");
Py_SetProgramName(L"my_program");
PyMethodDef pyModuleMethods[] = {
{ "runTester", (PyCFunction)runTesterFunc, METH_VARARGS | METH_KEYWORDS, "Foo Boo." },
{ NULL, NULL, 0, NULL }
};
static PyModuleDef MyModule = {
PyModuleDef_HEAD_INIT,
"my_module",
"Foo Boo.",
-1,
pyModuleMethods,
NULL
};
return PyModule_Create(&MyModule);
}
void initializePython() {
PyImport_AppendInittab("my_module", getModule);
Py_Initialize();
}
};
int main() {
static MyClass& myObj = MyClass::getInstance();
myObj.initializePython();
PyRun_SimpleString(
"import my_module n"
"my_module.runTester() n"
);
return 0;
}
问题是当我在PyRun_SimpleString
中运行my_module.runTester()
时.我收到以下错误消息:
系统错误: PyCFunction_Call中的错误呼叫标志。METH_OLDARGS不是 支持时间更长!
我没有使用METH_OLDARGS
.如您所见,我正在使用METH_VARARGS | METH_KEYWORDS
.我在这里可能缺少什么?
我使用的是Python 3.6和Windows 7 x64。
以下修改解决了该问题:
static PyMethodDef pyModuleMethods[] = {
{ "runTester", (PyCFunction)runTesterFunc, METH_VARARGS | METH_KEYWORDS, "Foo Boo." },
{ NULL, NULL, 0, NULL }
};
static struct PyModuleDef MyModule = {
PyModuleDef_HEAD_INIT,
"my_module",
"Foo Boo.",
-1,
pyModuleMethods,
NULL
};
相关文章:
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 何时包含内置类型和运算符的标头?
- 基本类型与内置类型有什么区别C++
- 指内置类型的文字
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- 像自定义类一样构造的指针(内置类型)如何工作?
- 内置类型与用户定义的类型 C++
- 无法从 Python C API 中内置的模块调用方法
- 内置和静态链接的升压模块会导致 shutdown_service() 出现一堆链接器错误
- 如何使用C++插件中内置的模块中的node.js
- 自定义boost python模块内置mpi