在nix-shell中编译pyenv管理的Python需安装哪些依赖?
解决NixOS下pyenv编译Python依赖缺失问题
问题分析
在NixOS 23.11环境中,使用pyenv编译Python 3.11.7以追求最高性能时,出现curses、ctypes、readline、ssl扩展模块编译失败的错误。原因是NixOS的依赖包分为运行时和开发版本,当前安装的是运行时版本,缺少编译所需的头文件和静态库;同时编译工具无法自动识别Nix隔离存放的库路径。
解决方案
1. 配置开发版依赖与环境变量
创建shell.nix文件,集成编译所需的开发版依赖,并自动设置编译环境变量:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = with pkgs; [ gnumake libgcc gcc13 zlib.dev gdb openssl.dev bzip2.dev ncurses.dev libffi.dev readline.dev pyenv ]; shellHook = '' # 配置编译工具的头文件与库路径 export CFLAGS="-I${pkgs.ncurses.dev}/include -I${pkgs.libffi.dev}/include -I${pkgs.readline.dev}/include -I${pkgs.openssl.dev}/include -I${pkgs.zlib.dev}/include -I${pkgs.bzip2.dev}/include" export LDFLAGS="-L${pkgs.ncurses.dev}/lib -L${pkgs.libffi.dev}/lib -L${pkgs.readline.dev}/lib -L${pkgs.openssl.dev}/lib -L${pkgs.zlib.dev}/lib -L${pkgs.bzip2.dev}/lib" export PKG_CONFIG_PATH="${pkgs.ncurses.dev}/lib/pkgconfig:${pkgs.libffi.dev}/lib/pkgconfig:${pkgs.readline.dev}/lib/pkgconfig:${pkgs.openssl.dev}/lib/pkgconfig" # 开启Python最高性能编译选项 export PYTHON_CONFIGURE_OPTS="--enable-optimizations --with-lto --enable-shared" ''; }
2. 清理旧编译缓存
卸载已失败的Python版本并清理缓存文件:
pyenv uninstall -f 3.11.7 rm -rf ~/.pyenv/cache/python-3.11.7*
3. 重新编译Python
进入配置好的nix-shell环境,执行编译命令:
nix-shell shell.nix --pure pyenv install 3.11.7
关键说明
- NixOS中必须安装
*.dev后缀的依赖包,这类包包含编译所需的头文件和静态库,普通版本仅提供运行时支持。 - 设置
CFLAGS、LDFLAGS是为了让gcc编译器能找到Nix隔离存放的库文件,否则编译时会自动跳过对应扩展模块。 PYTHON_CONFIGURE_OPTS中的参数对应最高性能编译要求,开启了编译优化、链接时优化等选项。
内容的提问来源于stack exchange,提问作者amirreza
相关产品推荐
相关产品推荐

