根本原因是Python编译时未找到libffi开发库,导致_configure_阶段静默跳过_ctypes模块编译;需安装libffi-devel(CentOS)或libffi-dev(Ubuntu),并确保pkg-config可查到,配置时加--with-system-ffi,否则_ctypes缺失将影响torch、multiprocessing等依赖模块。

这是 Python 编译安装时漏掉了 _ctypes 扩展,根本原因不是缺 Python 包,而是底层 C 依赖没被识别或链接失败。
为什么 configure 阶段就该检查 libffi
Python 的 _ctypes 模块必须依赖系统级的 libffi 开发库(不是运行时库),否则 configure 会静默跳过该模块编译。你看到的报错只是结果,真正问题在 configure 日志里 —— 它通常会写一句:the necessary bits to build these optional modules were not found: _ctypes。
- 先确认系统有没有
libffi-devel(CentOS/RHEL)或libffi-dev(Ubuntu/Debian):运行pkg-config --modversion libffi,有输出才说明开发头文件和 pkgconfig 文件就位 - 如果没装,普通用户可用
--prefix指向自己的目录,再用export PKG_CONFIG_PATH=/your/local/lib/pkgconfig告诉 configure 去哪找 libffi - configure 必须显式加
--with-system-ffi,否则即使 libffi 存在,Python 也可能尝试自己编译一份失败的副本
make 时如何验证 _ctypes 是否被启用
不要等 make install 完再测试。编译完但还没 install 时,直接跑源码目录下的解释器:
./python -c "import _ctypes"
如果报错,说明 make 阶段就没编出来;如果成功,再看 find ./build -name "_ctypes*.so" 能否找到产物。常见失败点:
立即学习“Python免费学习笔记(深入)”;
-
make过程中出现undefined reference to ffi_*—— 是链接阶段找不到 libffi 的 .a 或 .so,不是头文件问题 - 用了
--enable-optimizations却没装libffi,PGO 会加剧模块缺失概率 - setuptools 版本过高(≥60)可能干扰构建流程,临时降级到
setuptools==58.1.0再重试 configure
无 sudo 权限时怎么绕过系统 libffi
你没法 yum install libffi-devel,但可以自己编译 libffi 并软链进 Python 构建路径:
- 下载 libffi 源码,
./configure --prefix=$HOME/local && make && make install - 设置环境变量:
export LIBFFI_CFLAGS="-I$HOME/local/include" LIBFFI_LIBS="-L$HOME/local/lib -lffi" - 然后 configure Python 时加:
./configure --prefix=$HOME/python312 --with-system-ffi LDFLAGS="-L$HOME/local/lib" CPPFLAGS="-I$HOME/local/include" - 注意:
LDFLAGS和CPPFLAGS必须在 configure 命令里传入,export 不生效
Windows 上遇到同样报错的特殊处理
Windows 下几乎不会在源码编译时出这问题,但如果你用 PyInstaller 打包、或手动删了 DLLs 目录里的 _ctypes.pyd,就会触发这个错误。此时:
- 别查 pip 或 conda ——
_ctypes是 Python 自带的二进制扩展,路径固定在PythonXX/DLLs/_ctypes.pyd - 用
where python确认当前执行的是哪个 Python,再进去看 DLLs 目录是否存在该文件 - PyInstaller 用户必须在 spec 文件里加
hiddenimports=['_ctypes'],否则它默认不打包这个模块 - 重装 Python 时勾选 “Add Python to PATH” 和 “Install for all users”(哪怕你是单用户,这个选项会影响 DLLs 目录写入权限)
最容易被忽略的是:configure 日志里那行关于 _ctypes 的提示,它不报错也不中断流程,但决定了你后面所有依赖 ctypes 的包(torch、multiprocessing、flask 等)是否能正常 import。


















