如何在configuration.nix中注册Python模块?解决akshare安装报错
问题
需要在NixOS中安装系统级Python模块akshare,该模块不在Nixpkgs中,仅能从PyPI获取。尝试在my-python-packages中声明该模块并加入configuration.nix的environment.systemPackages,配置如下:
let my-python-packages = ps: with ps; [ # ... ( buildPythonPackage rec { pname = "akshare"; version = "1.10.57"; src = fetchPypi { inherit pname version; sha256 = "72b339e19d507c32193ad490ef19cf6692d82eecb7445e3567d4b2ed5ffa90e1"; }; doCheck = true; propagatedBuildInputs = [ # Specify dependencies pkgs.python311Full.withPackages(ps: with ps; [ numpy ]) ]; } ) ]; in { // other configs ... environment.systemPackages = with pkgs; [ # Other system packages podman-desktop (python311Full.withPackages(ps: with ps; [ pandas requests polars numpy]++ my-python-packages)) rargs redis ripgrep ]; # Other configuration options # ... }
重建系统时返回错误:
error: value is a function while a list was expected at /nix/store/61k92av6g5yb3hg29ijjiahj06hp0h56-source/configuration.nix:360:44: 359| podman-desktop 360| (python311Full.withPackages(ps: with ps; [ pandas requests polars numpy]++ my-python-packages)) | ^ 361| rargs (use '--show-trace' to show detailed location information)
修复方法
错误源于两个问题:
my-python-packages是接收ps参数的函数,直接用++拼接会把函数当成列表元素,导致类型不匹配,必须调用my-python-packages ps获取实际包列表。propagatedBuildInputs中不应使用pkgs.python311Full.withPackages,需直接传入当前Python环境下的依赖包(即ps.numpy),否则会引入独立Python环境引发依赖冲突。
正确配置代码如下:
let my-python-packages = ps: with ps; [ # ... ( buildPythonPackage rec { pname = "akshare"; version = "1.10.57"; src = fetchPypi { inherit pname version; sha256 = "72b339e19d507c32193ad490ef19cf6692d82eecb7445e3567d4b2ed5ffa90e1"; }; doCheck = true; # 直接使用当前Python环境的numpy,避免创建独立环境 propagatedBuildInputs = with ps; [ numpy ]; # 可选:若akshare测试环节报错,可关闭检查 # doCheck = false; } ) ]; in { // other configs ... environment.systemPackages = with pkgs; [ podman-desktop # 调用my-python-packages并传入当前ps参数,拼接有效包列表 (python311Full.withPackages(ps: with ps; [ pandas requests polars numpy ] ++ my-python-packages ps)) rargs redis ripgrep ]; # Other configuration options # ... }
内容的提问来源于stack exchange,提问作者Arthur Zhang
相关产品推荐
相关产品推荐

