Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编译用c编写的python模块时,初始值设定项不是常量,错误为C2099_Python_C_Visual C++_Python C Api - Fatal编程技术网

在编译用c编写的python模块时,初始值设定项不是常量,错误为C2099

在编译用c编写的python模块时,初始值设定项不是常量,错误为C2099,python,c,visual-c++,python-c-api,Python,C,Visual C++,Python C Api,我试图在windows 10上使用msvc 2017编译一个名为c“python setup.py install--with-c”的python模块,但出现了以下错误 cddistance/distance.c(647):错误C2099:初始值设定项不是 不变的 cddistance/distance.c(689):错误C2099:初始值设定项不是 不变的 错误:命令“C:\Program Files(x86)\Microsoft Visual Studio\ 2017\BuildTools\

我试图在windows 10上使用msvc 2017编译一个名为c“python setup.py install--with-c”的python模块,但出现了以下错误

cddistance/distance.c(647):错误C2099:初始值设定项不是 不变的

cddistance/distance.c(689):错误C2099:初始值设定项不是 不变的

错误:命令“C:\Program Files(x86)\Microsoft Visual Studio\ 2017\BuildTools\VC\Tools\MSVC\14.10.25017\bin\HostX64\ x64\cl.exe'失败,退出状态为2

这是第647行的代码

   646 PyTypeObject IFastComp_Type = {
   647     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   648  "distance.ifast_comp", /* tp_name */
   649  sizeof(ItorState), /* tp_basicsize */
   650  0, /* tp_itemsize */
        (destructor)itor_dealloc, /* tp_dealloc */
        0, /* tp_print */
        0, /* tp_getattr */
        0, /* tp_setattr */
        0, /* tp_reserved */
        0, /* tp_repr */
        0, /* tp_as_number */
        0, /* tp_as_sequence */
        0, /* tp_as_mapping */
        0, /* tp_hash */
        0, /* tp_call */
        0, /* tp_str */
        0, /* tp_getattro */
        0, /* tp_setattro */
        0, /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT, /* tp_flags */
        ifast_comp_doc, /* tp_doc */
        0, /* tp_traverse */
        0, /* tp_clear */
        0, /* tp_richcompare */
        0, /* tp_weaklistoffset */
        PyObject_SelfIter, /* tp_iter */
        (iternextfunc)ifastcomp_next, /* tp_iternext */
        0, /* tp_methods */
        0, /* tp_members */
        0, /* tp_getset */
        0, /* tp_base */
        0, /* tp_dict */
        0, /* tp_descr_get */
        0, /* tp_descr_set */
        0, /* tp_dictoffset */
        0, /* tp_init */
        PyType_GenericAlloc, /* tp_alloc */
        ifastcomp_new, /* tp_new */
    };
第689行是另一个类似strucure的

688  PyTypeObject ILevenshtein_Type = {
689     PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "distance.ilevenshtein", /* tp_name */
        sizeof(ItorState), /* tp_basicsize */
        0, /* tp_itemsize */
        (destructor)itor_dealloc, /* tp_dealloc */
        0, /* tp_print */
        0, /* tp_getattr */
        0, /* tp_setattr */
        0, /* tp_reserved */
        0, /* tp_repr */
在同一页中引用了以下内容

762 if (PyType_Ready(&IFastComp_Type) != 0 || PyType_Ready(&ILevenshtein_Type)!= 0)
763 #if PY_MAJOR_VERSION >= 3
        return NULL;
    #else
        return;
    #endif

    Py_INCREF((PyObject *)&IFastComp_Type);
    Py_INCREF((PyObject *)&ILevenshtein_Type);

感谢

我找到了解决方案,通过查看PyTypeObject结构的定义,我通过
PyVarObject\u HEAD\u INIT(NULL,0)
更改了
yVarObject\u HEAD\u INIT(&PyType\u Type,0)
并成功编译了它,我尝试了一些函数,它工作正常,所以这个错误是由
&PyType\u Type
引起的,它是一个
PyObject*
,我知道因为
IFastComp\u Type
是一个全局变量,它应该由一个常量初始化,但我仍然不知道为什么模块的作者给出了
&PyType\u Type
作为参数,谢谢大家的评论。

我找到了解决方案,通过查看PyTypeObject结构的定义,我已经通过
PyVarObject\u HEAD\u INIT(&PyType\u Type,0)
修改了
PyVarObject\u HEAD\u INIT(NULL,0)
并成功编译了它,我已经尝试了一些函数,它工作了,所以这个错误是由
&PyType\u Type
引起的,它是一个
PyObject*
,我知道因为
如果stcomp\u Type
是一个全局变量,它应该由一个常量初始化,但我仍然不知道为什么模块的作者给出了
&PyType\u Type
作为参数,谢谢大家的评论。

请参阅

这条线有点粗糙;我们想写的是:

PyVarObject\u HEAD\u INIT(&PyType\u Type,0)

因为类型对象的类型是“type”,但这不是严格符合C的,一些编译器抱怨。幸运的是,这个成员将由
PyType\u Ready()
为我们填写

我假设Visual C是投诉的编译器,并且该模块是用GCC编写和测试的…

请参见

这条线有点粗糙;我们想写的是:

PyVarObject\u HEAD\u INIT(&PyType\u Type,0)

因为类型对象的类型是“type”,但这不是严格符合C的,一些编译器抱怨。幸运的是,这个成员将由
PyType\u Ready()
为我们填写


我假设VisualC是抱怨的编译器,模块是用GCC编写和测试的…

这一行“第647行”有很多行。哪个是647,哪个是689?你知道如何初始化全局变量吗?其中一个符号不是常量。发现哪一个,你就完成了。如果您不知道如何购买一本好的C语言书,因为我们不是免费的学习服务,
ifast\u comp\u doc
是如何声明的?(我只是把它与我们在C++中编写的Python类进行了比较。我看不出有什么明显的错误。)我按照ALK的建议编辑了它,是的,当然我是用一个常数来做的,但是我没有找出哪一个,@ PTERJ:<代码> const <代码>在C中不创建常数。这行“行647”是多行。哪个是647,哪个是689?你知道如何初始化全局变量吗?其中一个符号不是常量。发现哪一个,你就完成了。如果您不知道如何购买一本好的C语言书,因为我们不是免费的学习服务,
ifast\u comp\u doc
是如何声明的?(我只是把它与我们在C++中编写的Python类进行比较。我看不出明显的错误。)我按照ALK的建议编辑了它,是的,当然我是用一个常数来做的,但是我没有弄清楚是哪一个,@ PTERJ:<代码> const 不在C中创建一个常量。我不知道一致性。我认为VC在这里的表现不够正确——我引用的是Python文档,而不是声称理解C标准。听起来VC在这里是错误的,但是使用PythonC接口的标准方法是编写VC可以处理的代码。编写
PyVarObject\u HEAD\u INIT(NULL,0)
很有帮助。我不确定是否符合要求,我认为VC在这里的行为不够公正-我引用的是Python文档,而不是声称理解C标准。听起来VC在这里是错误的,但是使用PythonC接口的标准方法是编写VC可以处理的代码。写入
PyVarObject\u HEAD\u INIT(NULL,0)
有帮助。
PyVarObject_HEAD_INIT(NULL, 0)