poetry2nix icon indicating copy to clipboard operation
poetry2nix copied to clipboard

Question: How can one use the passthru in the overrides?

Open vale981 opened this issue 3 years ago • 10 comments

I recently fixed a typo that I came across while trying to get the passthru argument to work: https://github.com/nix-community/poetry2nix/pull/509/commits/390173bce21aa5eaa65ea7171d75a75382e964f5

Unfortunately, I still could not find out how that could be achieved. Specifying

matplotlib = super.matplotlib.overridePythonAttrs (
                      old: {
                        passthru.enableTk = true;
                      }
                    );

in the overrides didn't seem to do anything.

vale981 avatar Jan 18 '22 09:01 vale981

This isn't at all obvious, but passthru.args is set to whatever is passed to the function that creates the derivation.

Matplotlib didn't look at passthru.args, but instead looked at passthru. This should be fixed in https://github.com/nix-community/poetry2nix/pull/516.

With this change you should be able to create an override looking something like:

matplotlib = super.matplotlib.override { enableTk = true; }

adisbladis avatar Jan 18 '22 10:01 adisbladis

thank you very much for the hint. I'll try it out :)

vale981 avatar Jan 20 '22 12:01 vale981

How is this applied? I tried

        poetryEnv = pkgs.poetry2nix.mkPoetryEnv {
          projectDir = ./.;
          overrides = pkgs.poetry2nix.overrides.withDefaults (final: prev: {
            matplotlib = prev.matplotlib.override { enableTk = true; };
          });
          editablePackageSources = {
            my-app = ./src;
          };
        };

and get the error

import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

mschneiderwng avatar Jan 23 '22 14:01 mschneiderwng

How is this applied? I tried

        poetryEnv = pkgs.poetry2nix.mkPoetryEnv {
          projectDir = ./.;
          overrides = pkgs.poetry2nix.overrides.withDefaults (final: prev: {
            matplotlib = prev.matplotlib.override { enableTk = true; };
          });
          editablePackageSources = {
            my-app = ./src;
          };
        };

and get the error

import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

That does indicate that it is working, but you would also need to pass python3Full to mkPoetryEnv as the default python build doesn't enable tk.

adisbladis avatar Jan 23 '22 19:01 adisbladis

I got the impression that the flags enableTk and enableQt load the necessary packages with these lines.

At the moment, enableTk and enableQt have no effect. Qt works if and only if I pass pkgs.qt5.full to buildInputs and Tk only works if I pass pkgs.python3Full to buildInputs.

What is the purpose then of enableTk and enableQt ?

mschneiderwng avatar Jan 24 '22 06:01 mschneiderwng

Changing the below code in overrides/default.nix

 matplotlib = super.matplotlib.overridePythonAttrs (
      old:
        let
          enableGhostscript = old.passthru.args.enableGhostscript or false;

into

 matplotlib = super.matplotlib.overridePythonAttrs (
      old:
        let
          enableGhostscript = old.passthru.args.enableGhostscript;

makes the nix repl moan the following.

error: attribute 'enableGhostscript' missing

shell.nix ``` { pkgs ? import ../nixpkgs {} }: let myAppEnv = pkgs.poetry2nix.mkPoetryEnv { projectDir = ./.; python = pkgs.python3Full; overrides = pkgs.poetry2nix.overrides.withDefaults (final: prev: { matplotlib = prev.matplotlib.override { enableGhostscript = true; }; }); }; in {inherit myAppEnv pkgs;} ```
pyproject.toml ``` [tool.poetry] name = "my-python-package" version = "0.1.0" description = "" authors = ["Suwon Park "]

[tool.poetry.dependencies] python = "3.9.10" matplotlib = "^3.5.1" kiwisolver = "<=1.3.2" cppy = "<=1.1.0"

[tool.poetry.dev-dependencies]

[build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"

</details>

sepiabrown avatar Apr 10 '22 00:04 sepiabrown

My hypothesis is that when using pkgs.poetry2nix.overrides.withDefaults, if the python package you want to override is either in the file overrides/default.nix or overrides/build-systems.json, you cannot override with the method that @adisbladis showed as follows.

This isn't at all obvious, but passthru.args is set to whatever is passed to the function that creates the derivation.

Matplotlib didn't look at passthru.args, but instead looked at passthru. This should be fixed in #516.

With this change you should be able to create an override looking something like:

matplotlib = super.matplotlib.override { enableTk = true; }

That said, the above method works with pkgs.poetry2nix.overrides.withoutDefaults and works with packages like pyro-ppl that are neither in overrides/default.nix nor overrides/build-systems.json.

I've also tested the above hypothesis with matplotlib which is only in overrides/default.nix. After commenting out matplotlib part in overrides/default.nix, matplotlib has passthru.args with correct values!

shell.nix ``` sepiabrown@localhost:~/testtesttest$ cat shell.nix { pkgs ? import ../nixpkgs {} }: let myAppEnv = pkgs.poetry2nix.mkPoetryEnv { projectDir = ./.; overrides = pkgs.poetry2nix.overrides.withDefaults (final: prev: { peewee = prev.peewee.override { withPostgres = true; test_peewee = "peewee"; }; pyro-ppl = prev.pyro-ppl.override { test_pyro = "pyro"; }; tomli = prev.tomli.override { test_tomli = "tomli"; }; emoji = prev.emoji.override { test_emoji = "emoji"; }; matplotlib = prev.matplotlib.override { enableGhostscript = true; test_mat = "mat"; }; }); }; in {inherit myAppEnv pkgs;} # myAppEnv.env ```
pyproject.toml ``` [tool.poetry] name = "my-python-package" version = "0.1.0" description = "" authors = ["Suwon Park "]

[tool.poetry.dependencies] python = "3.9.10" numpy = "^1.22.3" pyro-ppl = "^1.8.1" peewee = "^3.14.10" tomli = "^2.0.1" emoji = "^1.7.0" matplotlib = "^3.5.1"

[tool.poetry.dev-dependencies]

[build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"

</details>

sepiabrown avatar Apr 10 '22 10:04 sepiabrown

This works for me:

{ pkgs ? import <nixos> { } }:

pkgs.poetry2nix.mkPoetryEnv {
  projectDir = ./.;
  python = pkgs.python3Full;
  overrides = pkgs.poetry2nix.overrides.withDefaults (self: super: {
    matplotlib = super.matplotlib.overridePythonAttrs (
      old: {
        enableTk = true;
      }
    );
  });
}

AlexChalk avatar Jul 05 '23 17:07 AlexChalk

super.matplotlib.overridePythonAttrs didn't work for me, though I'm using a flake. The derivation's attribute does change, but it doesn't affect matplotlib's buildInputs. super.matplotlib.override does work.

There's separate error when using enableTk; The pkgs.libX11 input isn't found. I'm guessing because it's a spliced package, and for some reason the spliced top-level packages aren't in the pkgs that's being evaluated. https://github.com/nix-community/poetry2nix/blob/3c92540611f42d3fb2d0d084a6c694cd6544b609/overrides/default.nix#L1481

Here's the poetry2nix flake template modified to use Qt instead:

{
  description = "Application packaged using poetry2nix";

  inputs = {
    flake-utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    poetry2nix = {
      url = "github:nix-community/poetry2nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, flake-utils, poetry2nix }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples.
        pkgs = nixpkgs.legacyPackages.${system};
        inherit (poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }) mkPoetryApplication overrides;
      in
      {
        packages = {
          myapp = mkPoetryApplication {
            projectDir = self;
            python = break pkgs.python3Full;
            overrides = overrides.withDefaults (self: super: {
              matplotlib = super.matplotlib.override (
                old: {
                  enableQt = true;
                }
              );
            });
          };
          default = self.packages.${system}.myapp;
        };

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

          # Setup QT_PLUGIN_PATH
          # Source: https://discourse.nixos.org/t/python-qt-woes/11808/12
          buildInputs = [
            pkgs.qt5.wrapQtAppsHook
            pkgs.makeWrapper
          ];
          shellHook = ''
            setQtEnvironment=$(mktemp --suffix .setQtEnvironment.sh)
            makeWrapper "/bin/sh" "$setQtEnvironment" "''${qtWrapperArgs[@]}"
            sed "/^exec/d" -i "$setQtEnvironment"
            source "$setQtEnvironment"
          '';
        };
      });
}

jicksaw avatar Mar 28 '24 20:03 jicksaw

I totally forgot that I ever opened that issue and recently "re-discovered" the solution. For me, the original tip by @adisbladis works in a flake.

overrides = poetry2nix.overrides.withDefaults (final: prev: {
              matplotlib = with pkgs; prev.matplotlib.override (
                {
                  enableGtk3 = true;
                }
              );
            });

For me this resolves the issue!

vale981 avatar May 13 '24 15:05 vale981