我正在为Python 3开发C ++扩展,并尝试将DateTime对象传递给我的函数。 PyDateTime_Check函数似乎工作并返回true,但是当我尝试从DateTime对象获取年份时它返回65535.我将datetime.datetime.now()传递给python中的函数。
我的c ++代码是:
#include "Python.h"
#include "datetime.h"
static PyObject* new_func(Pyobject* self, PyObject* args)
{
PyDateTime_DateTime *pydate;
if(!PyArg_ParseTuple(args, "O", &pydate)){
return Py_BuildValue("s", "Error");
}
int year;
year = PyDateTime_GET_YEAR(pydate);
return PyLong_FromLong(year);
}
static PyMethodDef NbourMethods[] =
{
{"new_func", new_func, METH_VARARGS, "Do date things."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef cFunc =
{
PyModuleDef_HEAD_INIT,
"cFunc", /* name of module */
"", /* module documentation */
-1, /* size of per-interpreter state of the module or -1 if global */
NbourMethods
};
PyMODINIT_FUNC PyInit_cFunc(void)
{
if (!PyDateTimeAPI) { PyDateTime_IMPORT;}
return PyModule_Create(&cFunc);
}
然后我的python代码是:
import cFunc
start = datetime.datetime.now()
print(str(cFunc.new_func(start)))
有什么想法?我能够成功运行PyDateTime_Check(pydate)并获得返回值true,但由于某种原因,它不会在上面的代码中返回年份(返回65535)。提前谢谢!
答案 0 :(得分:0)
所以在弄乱了一些之后,编译器和python库似乎都存在问题。改变这些产生了期望的结果。我确实在下面有一个奇怪的黑客,但扩展模块每次加载时耗尽了大约4GB的RAM - >表明发生了更多错误。似乎是MinGW的一个潜在问题。
我原来的解决方案:
所以只是搞乱并查看基础datetime.h并进行一些探索 - 我的日期PyObject中似乎有4个字节未使用。不知道为什么会这样。
临时修复是通过引用字节4和5(而不是函数中的0和1)来返回年份:
year = ((((PyDateTime_Date *)pydate)->data[4] << 8) | ((PyDateTime_Date *)pydate)->data[5]);
这不是很好,但另一种方法是在导入datetime.h之后定义我自己的GET_YEAR函数:
#define PyDateTime_GET_YEAR_NEW(o) ((((PyDateTime_Date*)o)->data[4] << 8) | \
((PyDateTime_Date*)o)->data[5])
然后函数的返回可能是:
return PyLong_FromLong(PyDateTime_GET_YEAR_NEW(pydate));