扩展中的日期时间对象方法C++问题
Trouble with DateTime object methods in C++ extension
我正在为 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(。提前感谢!
因此,
在弄乱了更多之后,编译器和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));
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法