You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python模块在解释器导入正常,调用PyImport_ImportModule却报错?

根因说明

该错误是典型的Python C扩展加载时核心符号缺失问题:

  • 直接运行Python官方解释器时,解释器进程默认会将libpython的所有API符号暴露到全局符号表,因此psutil这类依赖C扩展的模块可以正常加载。
  • 当你通过自定义共享对象调用Python C API加载模块时,加载该共享对象的宿主程序默认不会将libpython的符号暴露到全局符号域,psutil的C扩展在查找PyExc_RuntimeError这类核心Python符号时就会触发未定义符号报错。

解决方案

按优先级从高到低尝试以下方法:

  1. dlopen加载共享库时添加RTLD_GLOBAL标志
    如果你的宿主程序是通过dlopen加载用于调用Python API的共享对象,将加载参数修改为:
dlopen("your_python_loader.so", RTLD_NOW | RTLD_GLOBAL);

RTLD_GLOBAL参数会将当前加载的共享对象及其依赖的所有库的符号暴露到全局符号表,后续Python加载C扩展时就能正常找到所需符号。

  1. 编译宿主程序时添加-rdynamic参数
    如果你是直接在宿主程序中链接Python库、调用Python C API,编译链接时添加-rdynamic参数:
gcc your_main.c -o your_main -rdynamic $(python3.8-config --cflags --ldflags)

该参数会将宿主程序的所有全局符号暴露到动态符号表,满足C扩展的符号查找需求。

  1. 确认Python版本一致性
    你当前的排查信息显示依赖的libpython3.8和psutil扩展的Python版本(cpython-38)匹配,不需要额外调整,若后续更换环境需要确保两者版本完全一致。

内容的提问来源于stack exchange,提问作者jsofri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:06:09