如何用Nix Flake创建等价于python main.py的可执行文件
解决Nix构建Python可执行文件的问题
错误原因
- 引入了
poetry2nix.mkPoetryApplication但项目未使用Poetry管理依赖,缺少poetry.lock文件导致构建失败。 - 首次配置的App使用了未包含依赖的原始Python解释器,运行时无法找到pandas等模块。
修正后的flake.nix配置
{ description = "virtual environment with python and streamlit"; 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.python311; # 定义包含依赖的Python环境 pythonWithDeps = python.withPackages(ps: with ps; [ ipython matplotlib pandas ]); myDevTools = [ pythonWithDeps pkgs.streamlit ]; # 封装可执行脚本,调用带依赖的Python执行main.py myApp = pkgs.writeScriptBin "my-python-app" '' #!${pkgs.bash}/bin/bash exec ${pythonWithDeps}/bin/python ${self}/main.py "$@" ''; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; # 设置默认构建产物为我们的可执行程序 packages.default = myApp; # 配置App指向可执行文件,支持nix run直接启动 apps.default = flake-utils.lib.mkApp { program = "${myApp}/bin/my-python-app"; }; }); }
用法说明
- 构建可执行文件:执行
nix build,当前目录会生成result符号链接,运行./result/bin/my-python-app即可执行main.py,所有依赖已被正确包含。 - 直接运行程序:执行
nix run,无需提前构建即可直接启动main.py。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

