【发布时间】:2019-04-29 12:56:37
【问题描述】:
我跟着this answer调用PyDateTime_FromTimestamp用C++创建了一个datetime对象。但是当PyDateTime_FromTimestamp 被调用时,我得到了一个Segmentation fault。
这是我的 C++ 代码:
#include <python3.6/Python.h>
#include <stdio.h>
#include <python3.6/datetime.h>
#include <sys/time.h>
static PyObject *iGetDateTime_PyFn(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) {
static double doubleValue = 1314761451;
PyObject *floatObj = NULL;
PyObject *timeTuple = NULL;
PyObject *dateTime = NULL;
floatObj = PyFloat_FromDouble(doubleValue);
timeTuple = Py_BuildValue("(O)", floatObj);
printf("timeTuple = %08x\n", (unsigned int)(long long)timeTuple);
printf("PyTuple_Check(timeTuple) = %d\n", PyTuple_Check(timeTuple));
dateTime = PyDateTime_FromTimestamp(timeTuple);
printf("ready to return\n");
return dateTime;
}
static PyMethodDef all_methods[] = {
{ "get_datetime", iGetDateTime_PyFn, METH_VARARGS, NULL },
{ NULL, NULL, 0, NULL }
};
static struct PyModuleDef main_module = {
PyModuleDef_HEAD_INIT,
"cpp",
NULL,
-1,
all_methods
};
PyMODINIT_FUNC PyInit_cpp(void) {
return PyModule_Create(&main_module);
}
我用这个命令编译:
g++ --shared -fPIC -o cpp.so t1.cpp
我的g++ 版本是7.3.0。
在python中,我执行:
import cpp
print(cpp.get_datetime())
我得到以下打印:
timeTuple = a7934358
PyTuple_Check(timeTuple) = 1
Segmentation fault (core dumped)
正如我们所见,timeTuple 已成功构建,它被检查为tuple。但是我们无法到达return 语句。
【问题讨论】:
-
请添加
ldd cpp.so命令输出,并在您的Python 脚本中添加import sys;print(sys.version),然后粘贴其输出。
标签: python c++ python-c-api python-datetime