gpt4 book ai didi

c++ - Python 3.7 和 excess_args 的 SWIG 问题

转载 作者:行者123 更新时间:2023-11-30 04:55:16 25 4
gpt4 key购买 nike

我有一些用于扩展模块的 C++ 代码,我刚刚从带有较旧 SWIG 的 Python2.7.11 升级到带有 SWIG 3.0.12 的 python3.7.1。我遇到类似于 https://bugs.python.org/issue34495 的问题,只有它的 Py_None 而不是 nullptrSWIG_Python_NewShadowInstance 中生成的代码使用 Py_None 调用 tp_new 作为第二个和第三个参数。

SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
{
...
#if PY_VERSION_HEX >= 0x03000000
inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);

这导致 object_new 调用,同时 argskwds 都指向 Py_None

object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
if (excess_args(args, kwds)) {

然后使用argskwds 调用excess_args

excess_args(PyObject *args, PyObject *kwds)
{
return PyTuple_GET_SIZE(args) ||
(kwds && PyDict_Check(kwds) && PyDict_GET_SIZE(kwds));

PyTuple_GET_SIZE(args)Py_None 上阻塞。

有谁知道如何解决这个问题?

最佳答案

经过更多研究,我找到了 this issue在 SWIGs GitHub 页面上。显然问题已得到解决,但没有发布修复的新版本。

更新

显然不需要更新。我用 github 中的当前版本替换了 LIb\python\pyrun.swg .那解决了我的问题。万一有人发现风险太大,可以只修补 SWIG_Python_NewShadowInstance 中有问题的代码部分,替换

SWIGRUNTIME PyObject* 
SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
{
...
#if PY_VERSION_HEX >= 0x03000000
inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
...
}

有了这个

SWIGRUNTIME PyObject* 
SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
{
...
#if PY_VERSION_HEX >= 0x03000000
PyObject *empty_args = PyTuple_New(0);
if (empty_args) {
inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, Py_None);
Py_DECREF(empty_args);
...
}
...
}

或者只是用固定版本替换整个函数。

关于c++ - Python 3.7 和 excess_args 的 SWIG 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com