使用Nix Flake安装pyecharts失败,报错缺少simplejson依赖
问题排查:Nix构建pyecharts时提示simplejson依赖缺失
问题描述
我使用的flake.nix配置如下:
{ description = ""; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python312; pyecharts = with pkgs.python3Packages; buildPythonPackage rec { pname = "pyecharts"; version = "2.0.6"; src = pkgs.fetchPypi { inherit pname version; sha256 = "4d7f8dcbee1525a6eeecab589efcdbe939feee4c46930d90b2734bff04077ecc"; }; }; python_packages = python.withPackages(ps: with ps;[ ipython pyecharts streamlit ]); myDevTools = [ python_packages ]; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; }); }
运行nix develop命令后,构建/nix/store/5cmw2nmna4fwc3jsqqmi6rspkvvsbmkq-python3.12-pyecharts-2.0.6.drv失败,报错提示pkg_resources.DistributionNotFound: The 'simplejson' distribution was not found and is required by the application。执行nix log查看完整日志后仍无法理解问题原因,请求协助排查。
解决方案
问题核心是你手动定义的pyecharts包未声明依赖项。pyecharts 2.0.6需要simplejson作为运行时依赖,但你的buildPythonPackage配置里没有添加这个依赖,导致构建过程中找不到它。
方案一:手动补充依赖
修改flake.nix中pyecharts的定义,添加依赖声明:
{ description = ""; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python312; pyecharts = with pkgs.python3Packages; buildPythonPackage rec { pname = "pyecharts"; version = "2.0.6"; src = pkgs.fetchPypi { inherit pname version; sha256 = "4d7f8dcbee1525a6eeecab589efcdbe939feee4c46930d90b2734bff04077ecc"; }; # 添加运行时依赖声明 propagatedBuildInputs = [ simplejson ]; # 若pyecharts还有其他依赖(如jinja2等),需一并补充 }; python_packages = python.withPackages(ps: with ps;[ ipython pyecharts streamlit ]); myDevTools = [ python_packages ]; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; }); }
方案二:直接使用nixpkgs内置的pyecharts包
更简单的方式是放弃手动构建,直接用nixpkgs中已维护好的pyecharts包,它会自动处理所有依赖:
{ description = ""; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python312; python_packages = python.withPackages(ps: with ps;[ ipython pyecharts # 直接使用nixpkgs内置包,依赖自动处理 streamlit ]); myDevTools = [ python_packages ]; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; }); }
关键说明
- 手动构建Python包时,必须显式声明所有依赖:运行时依赖用
propagatedBuildInputs,构建时依赖用buildInputs。 - 优先使用nixpkgs中已有的包,这类包已经完成了依赖梳理和验证,能避免手动维护依赖的繁琐问题。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

