Cannot run reproducible PyGObject example script

When I try to run the following script:

#! /usr/bin/env nix-shell
#! nix-shell -i python -p gtk4 python310 python310Packages.pygobject3
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

def on_activate(app):
    win = Gtk.ApplicationWindow(application=app)
    win.present()

app = Gtk.Application()
app.connect('activate', on_activate)
app.run(None)

I get the following error:
Traceback (most recent call last):
File “/home/elzair/Development/python/./nixtest.py”, line 4, in
gi.require_version(‘Gtk’, ‘4.0’)
File “/nix/store/gwq3inwc86axcxb82jpwkzci3hjpw1xd-python3.10-pygobject-3.42.2/lib/python3.10/site-packages/gi/init.py”, line 126, in require_version
raise ValueError(‘Namespace %s not available’ % namespace)
ValueError: Namespace Gtk not available

What seems to be the problem? Am I just missing some dependencies?

In this simple case, you need gobject-introspection for its setup hook to set GI_TYPELIB_PATH variable. But for more complex examples, you will need other variables as well, and that is not possible to express in shebang easily – a variable extraction similar to Python + Qt woes - #2 by jtojnar will be required.

I am currently trying to get this file to run and I’m bumping into the same issue. I have the following environment

[ (python3.withPackages
     (pp:
        [ pp.numpy
          pp.pygobject3
        ]
     )
  )
  gtk3
  gobject-introspection
]

and when I run it I get this error

Traceback (most recent call last):
  File "/home/mason/git/HexProver/hex_gui.py", line 4, in <module>
    gi.require_version("Gtk", "3.0")
  File "/nix/store/z2krx20irl3s8wrckq8r3fcyjvj1v51g-python3-3.10.12-env/lib/python3.10/site-packages/gi/__init__.py", line 126, in require_version
    raise ValueError('Namespace %s not available' % namespace)
ValueError: Namespace Gtk not available

How are you creating the environment? Note that the supported method is using nix-shell, installing libraries globally through nix-env or NixOS configuration will not work, see FAQ - NixOS Wiki

The list above are the inputs in my nix shell.

Wow, okay, I figured out what was going on. I was using a different thing to make the the nix shell (i.e. not pkgs.mkShell) and it turns out there is a crucial difference between the two that I was not aware of. it works now :rage:

Just out of curiosity? What was the thing that did not work?

I used GitHub - ursi/nix-make-shell.

Looks like mkShell adds some extra environment variables that I was not aware of. This project is mostly pointless now that bash completion works in mkShell, but my flake generator uses it so I just use it by default. Gonna stop now though since I thought it behaved the same as mkShell (it does 99% of the time) and this bug was very hard to figure out.