簡體   English   中英

Python C 擴展:ImportError:未定義符號:Py_InitModule4_64

[英]Python C Extension: ImportError: undefined symbol: Py_InitModule4_64

我一直在從事我的大學項目,該項目是為 Python 程序編寫 C 擴展。
我的代碼在我的 Windows 機器(+ Python 3.10)上完美編譯,但是當我嘗試在大學的機器(Linux-64 和 Python 2.7)上編譯它時,我收到錯誤"ImportError: undefined symbol: Py_InitModule4_64"
文件是: spkmeansmodule.c (模塊文件,我刪除了所有不相關的部分):

#define PY_SSIZER_T_CLEAN
#include <Python.h>
#include <stdio.h>

#include "spkmeans.h" 

#if PY_MAJOR_VERSION >=3
#define PY3K
#endif

PyObject *int_list;
int obser_length;
int *obser;

PyObject *double_list;
int data_length;
double *data;

static int wam(......) {...}

static PyObject* spkmeans(PyObject *self,PyObject *args)
{
    if(!PyArg_ParseTuple(args,"iiiOOs",&K,&d,&N,&int_list,&double_list,&goal))
        return NULL;

    obser_length = (int) PyObject_Length(int_list);
    obser = (int *) malloc(sizeof(int *) * obser_length);
    for(i=0;i<obser_length;i++)
    {
        PyObject *item;
        item = PyList_GetItem(int_list,i);
        obser[i] = (int) PyFloat_AsDouble(item);
    }

    data_length = (int) PyObject_Length(double_list);
    data = (double *) malloc(sizeof(double *) *data_length);
    for(i=0;i<data_length;i++)
    {
        PyObject *item;
        item = PyList_GetItem(double_list,i);
        data[i] = PyFloat_AsDouble(item);
    }
    return Py_BuildValue("i",wam(K,d,N,obser,data,goal));
    
}
static PyMethodDef spkmeansMethods[] = {
    {"wam",
        (PyCFunction) spkmeans,
        METH_VARARGS,
        PyDoc_STR("test")},
    {NULL,NULL,0,NULL}
};
#ifdef PY3K /* module definition structure for py3*/
static struct PyModuleDef moduledef = {
    PyModuleDef_HEAD_INIT,
    "spkmeans",
    NULL,
    -1,
    spkmeansMethods
};
PyMODINIT_FUNC PyInit_spkmeans(void) /* module init for py3 */
{
    return PyModule_Create(&moduledef);
} 
#else /* module init for python 2 */
PyMODINIT_FUNC PyInitspkmeans(void) {
    Py_InitModule("spkmeans",spkmeansMethods);
}
#endif 

這不是我的代碼的原始版本,我在使用這篇文章的答案收到一些警告(此作業中不允許警告)后對其進行了更改。
setup.py (設置文件):

from setuptools import setup,find_packages,Extension

setup(
    name='spkmeans',
    version = '0.1.0',
    author = 'ABC',
    description="t",
    install_requires=['invoke'],
    packages=find_packages(),
    license='GPL-2',
    ext_modules=[
        Extension(
            'spkmeans',
            ['spkmeansmodule.c'],
        ),
    ]
)

我還有一個用於函數聲明的頭文件spkeamns.h和 python 文件(使用模塊) spkmeans.py
現在,我可以構建沒有任何錯誤/警告(使用$python setup.py build_ext --inplace )但是當我嘗試運行spkeamns.py (通過簡單地運行python3 spkmeans.py )我得到前面提到的錯誤:

File "spkmeans.py", line 5, in <module>
import spkmeans as spk
ImportError: .../Project/spkmeans.so: undefined symbol: Py_InitModule4_64

我還發現這篇文章建議使用Py_InitModule() (我就是)和與系統的 32/64 位相關的東西(這在這里相關嗎?)。

我想在這里獲得一些幫助,我不明白為什么會顯示此錯誤以及如何解決它。 提前致謝。

這是由庫版本不匹配引起的。 問題是引用了 2.4.3 中刪除的符號: Py_InitMoudle4已移至Py_InitModule4_64 您可能正在使用為 2.4 或更早版本編譯的庫進行鏈接。 這將導致您的庫定義Py_InitModule4而不是它的 64 位對應項。 是討論更改的 pep 文檔。

要解決此問題,請更新系統上的 python 庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM