I’ve written about IPython shells with Nix previously.

One downside of relying on the nix-shell mechanism is that it uses environment variables, specifically PYTHONPATH which tends to be fragile when so much software insists on doing custom imports (e.g. gunicorn or Django).

Below is an alternative version for your .bashrc which builds something like a Python virtualenv and then sets PYTHONHOME. So far I’ve had less trouble with this new version:

function nix-ipython {
    packages=""
    for arg in $@; do
        packages="$packages $arg"
    done

    nix-shell -p "(python.buildEnv.override { extraLibs = with pythonPackages; [ ipython $packages ]; ignoreCollisions = true;})" --command ipython
}