![](/img/trans.png)
[英]C Python Module — ImportError: Symbol not found: _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.