Python 3.7 和 excess_args 的 SWIG 问题
SWIG issues with Python 3.7 and excess_args
我有一些扩展模块的代码C++代码,我刚刚从带有旧SWIG的Python2.7.11升级到带有SWIG 3.0.12的python3.7.1。我遇到了类似于 https://bugs.python.org/issue34495 的问题,只有它的Py_None
而不是nullptr
.SWIG_Python_NewShadowInstance
中生成的代码调用tp_new
,第 2 个和第 3 个参数带有Py_None
。
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
呼叫,args
和kwds
都指向Py_None
object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
if (excess_args(args, kwds)) {
然后用args
和kwds
呼叫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
窒息的地方.
有谁知道如何解决这个问题?
经过更多的研究,我在SWIGs GitHub页面上发现了这个问题。显然问题已解决,但没有新版本发布修复程序。
乌德帕特
显然不需要更新。我用 github 的当前版本替换了LIbpythonpyrun.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);
...
}
...
}
或者只是用固定版本替换整个功能。
相关文章:
- Python 3.7 和 excess_args 的 SWIG 问题
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为重写std::exception的库生成swig接口时出错
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 使用 swig 追加到字节数组
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- Java SWIG wrapper vs direct function calling
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 使用SWIG从C++回调到C#
- 从 C++ 到 Python 的 SWIG:未定义的符号导入问题
- CPPYY/CTYPES 将字符串数组作为 char* args[] 传递
- 如何使用 swig C++命名空间作为 python 模块公开
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 如何使模板函数像 R f<void(int)>(args...)