为了账号安全,请及时绑定邮箱和手机立即绑定

C Python 模块 — 导入错误:找不到符号:_Py_InitModule4_64

C Python 模块 — 导入错误:找不到符号:_Py_InitModule4_64

qq_花开花谢_0 2021-07-16 15:15:36
我正在开始用 C 编写 Python 3 模块的过程。 CI 编写的已经编译良好(我在帖子底部编译的代码)。我编译:python3 setup.py build_ext --inplace构建的 .so 文件放置在当前目录中。启动 python3 后,当我导入模块时出现此错误(用于截断路径的三重点):>>> import helloWorldTraceback (most recent call last):  File "<stdin>", line 1, in <module>ImportError: dlopen(..., 2): Symbol not found: _Py_InitModule4_64  Referenced from: .../helloWorld.cpython-36m-darwin.so  Expected in: flat namespace in .../helloWorld.cpython-36m-darwin.so我如何获得符号_Py_InitModule4_64实现?如果这意味着什么,我正在运行 macOS High Sierra为helloWorld.cpython-36m-darwin.so运行nm显示 _Py_InitModule4_64 未定义,那么这是否证明编译过程中存在问题?nm helloWorld.cpython-36m-darwin.so                  U _Py_BuildValue                 U _Py_InitModule4_640000000000000eb0 t _helloWorld0000000000001060 d _helloWorld_docs0000000000001020 d _helloworld_funcs0000000000000e80 T _inithelloWorld                 U dyld_stub_binder代码测试.c:#include <Python/Python.h>static PyObject* helloWorld(PyObject* self) {   return Py_BuildValue("s", "Hello, Python extensions!!");}static char helloWorld_docs[] =   "helloWorld( ): Any message you want to put here!!\n";static PyMethodDef helloworld_funcs[] = {   {"helloWorld", (PyCFunction)helloWorld,   METH_NOARGS, helloWorld_docs},   {NULL}};void inithelloWorld(void) {   Py_InitModule3("helloworld", helloworld_funcs, "Extension module example!");}设置.py:from distutils.core import setup, Extensionsetup(name = 'helloWorld', version = '1.0', \    ext_modules = [Extension('helloWorld', ['test.c'])])
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您针对 Python 2 C API 编写了您的模块(各种Py_InitModule函数纯粹用于 Python 2),但是您正在尝试编译它并使用 Python 3 运行它。CPython 的 C 层在 Python 2 和 3 之间发生了很大变化,据2to3我所知,没有用于 C 代码的工具。

您需要编写与 Python 3 API 兼容的代码才能在 Python 3 上工作;最简单的(也是 3.0-3.4 支持的唯一方法)转换是单阶段初始化(使用PyModule_Create),但多阶段初始化的行为更像是 Python 中定义的模块(例如,可以以某种方式完全卸载它们)单相模块可能)。入口点名称的结构也发生了变化,从initMODULENAMEPyInit_MODULENAME,因此您也需要对其进行更新。


查看完整回答
反对 回复 2021-07-28
  • 1 回答
  • 0 关注
  • 770 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号