如何使用 nix flake 创建 Python 可执行文件

问题描述 投票:0回答:1

我有一个包含两个文件的目录,main.pyflake.nix

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_packages = python.withPackages(ps: with ps;[
          ipython
          matplotlib
          pandas

        ]);


        myDevTools = [
          python_packages
        ];
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = myDevTools;
        };
      });
}

我应该在 flake.nix 中使用什么来创建与以下内容等效的可执行文件?

    python main.py

我想用命令创建可执行文件

    nix build

在 shell 中(这意味着安装了必要的软件包)

我已在我的文件中添加了应用程序:

{
  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;
        f = ps: with ps;[
          ipython
          matplotlib
          pandas
        ];
        pip_python_packages = python.withPackages(f);

        myDevTools = [
          pip_python_packages
          pkgs.streamlit
        ];
        outputName = builtins.attrNames self.outputs self.outputs;
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = myDevTools;
        };

        packages.default = pkgs.poetry2nix.mkPoetryApplication {
          projectDir = self;
        };
        apps.default = {
          program = "${python}/bin/python";
          args = [ "main.py" ];
          src = "./.";
          type = "app";
      };

      });
}

但是nix运行只是为了打开python解释器。

此外,我输入这一行

    nix/store/cxsw4x1189ppmsydhwsmssr0x65nygj7-python3-3.11.4/bin/python ./main.py

在我的壳里

因为 ${python} = cxsw4x1189ppmsydhwsmssr0x65nygj7-python3-3.11.4/bin/python

它不起作用:

ModuleNotFoundError:没有名为“pandas”的模块

我像这样更改了我的文件:

{
  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;
      f = ps: with ps;[
        ipython
        matplotlib
        pandas
      ];
      pip_python_packages = python.withPackages(f);

      myDevTools = [
        pip_python_packages
        pkgs.streamlit
      ];
      outputName = builtins.attrNames self.outputs self.outputs;
    in {
      devShells.default = pkgs.mkShell {
        buildInputs = myDevTools;
      };

      packages.default = pkgs.poetry2nix.mkPoetryApplication {
        projectDir = self;
      };

      apps.default = flake-utils.lib.mkApp {
        program = "${pip_python_packages}/bin/python";
        args = [ "${self}/main.py" ];
      };
    });
}

但是我运行后出现这个错误

nix run

错误: ...在评估属性“pkgs.buildPythonPackage”时

     at /nix/store/s1z7nb9n6r5n0r34fabp6yybwkbr8mjk-source/pkgs/development/interpreters/python/passthrufun.nix:87:5:

       86|     withPackages = import ./with-packages.nix { inherit buildEnv pythonPackages;};
       87|     pkgs = pythonPackages;
         |     ^
       88|     interpreter = "${self}/bin/${executable}";

   … while calling the 'mapAttrs' builtin

     at /nix/store/s1z7nb9n6r5n0r34fabp6yybwkbr8mjk-source/pkgs/development/interpreters/python/passthrufun.nix:31:8:

       30|           value;
       31|     in lib.mapAttrs func items;
         |        ^
       32|   in ensurePythonModules (callPackage

   (stack trace truncated; use '--show-trace' to show the full trace)

   error: getting status of '/nix/store/c274sjvcr30c80429v9kpn4n2q0ic6n9-source/poetry.lock': No

这样的文件或目录

python nix nix-flake
1个回答
0
投票

老问题,但这也许有帮助。

这里很多事情都是错误的。

但是nix运行只是为了打开python解释器。

是 -

args
在这里没有任何意义,因此被忽略。 只有
type
program
有任何意义

它不起作用:

ModuleNotFoundError:没有名为“pandas”的模块

这是因为

python
就是 Python 运行时。您的库位于它们自己的派生中,因此无法从该派生中访问。

如果您使用诗歌2nix,那么您应该更多地依赖that。请参阅他们的模板片

由于您没有包含

pyproject.toml
,因此很难重新创建您的设置,但可以通过以下方式添加这些包:

poetry add ipython streamlit matplotlib

然后您可以尝试类似这样的操作(请注意,poetry2nix 现在警告不要使用 nixpkgs 版本):

{
  description = "virtual environment with python and streamlit";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  inputs = {
    poetry2nix = {
      url = "github:nix-community/poetry2nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };
  outputs = { self, nixpkgs, flake-utils, poetry2nix }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
        inherit (poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }) mkPoetryApplication;

      in {
        devShells.default = pkgs.mkShell {
          inputsFrom = [ self.packages.${system}.default ];
        };

        packages.default = mkPoetryApplication {
          projectDir = self;
        };
      }
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.