Python 3中的分割错误PyType_Ready

4
我有一个应用程序,它以C ++启动并调用Python,我正在将其转换为Python 3。我在PyType_Ready中得到一个分段错误,而在python 2中却没有。
以下是在CENTOS 7上使用conda获取py2 / py3,在gcc 4.8.5上重现的步骤:
cd $WORKING # new empty directory
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh # use $WORKING/mc3 for the prefix
source mc3/etc/profile.d/conda.sh
conda create -n py2 python=2
conda create -n py3 python=3
conda activate py2
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib
g++ -o dummy_py2 -I$CONDA_PREFIX/include/python2.7 -L$CONDA_PREFIX/lib -lpython2.7 dummy.cpp
./dummy_py2 # this runs ok
conda deactivate
conda activate py3
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib
g++ -o dummy_py3 -I$CONDA_PREFIX/include/python3.8 -L$CONDA_PREFIX/lib -lpython3.8 dummy.cpp
./dummy_py3 # seg fault

dummy.cpp文件的位置:

#define PY_SSIZE_T_CLEAN
#include "Python.h"

typedef struct {
    PyObject_HEAD
    const char *data;
} MyObject;

static PyTypeObject MyObject_Type = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "mymod.MyObject",               /* tp_name */
    sizeof(MyObject),               /* tp_basicsize */
    0,                              /* tp_itemsize */
};


int main() {
  printf("This is a dummy test\n");
  PyType_Ready(&MyObject_Type);
  printf("We did it\n");
  return 0;
}

我使用了gdb来获取堆栈跟踪(编辑路径后):

#0  0x00007f6966929b62 in PyTuple_New () from $CONDA_PREFIX/lib/libpython3.8.so.1.0
#1  0x00007f696692bb46 in PyType_Ready () from $CONDA_PREFIX/lib/libpython3.8.so.1.0
#2  0x00007f696692ca27 in PyType_Ready () from $CONDA_PREFIX/lib/libpython3.8.so.1.0
#3  0x00000000004006b5 in main ()

相关参考(我使用的是示例部分):https://docs.python.org/3/c-api/typeobj.html 我试图从一个更大的应用程序中创建这个最小的示例,但希望这是一个受支持的用例?谢谢任何帮助。
1个回答

1

好的,问题已解决。我需要添加Py_Initialize。新的可用代码如下:

int main() {
  printf("This is a dummy test\n");
  Py_Initialize();
  PyType_Ready(&MyObject_Type);
  printf("We did it\n");
  return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接