• Re: Eshell and Python venv

    From Rust Buckett@rsstinnett@pm.me to gnu.emacs.help on Thu Jul 30 19:15:28 2026
    From Newsgroup: gnu.emacs.help

    Rust Buckett <rsstinnett@pm.me> writes:

    Manuel Giraud <manuel@ledu-giraud.fr> writes:

    Rust Buckett <rsstinnett@pm.me> writes:

    Is there a way to activate a Python virtual environment in Eshell? When >>> I try `source ./.venv/bin/activate`, I get "Wrong type argument: listp,
    "["". Obviously, this is because `source` is built into the shell
    (bash, csh, fish, eshell, etc.) and the default activate is for bash.
    So, I guess the real question is if there is already a script to
    activate the venv in eshell? Or some other way to do it?

    If you read "./.venv/bin/activate", you'll see that what it do mostly is
    setting VIRTUAL_ENV to "./venv" and add "$VIRTUAL_ENV/bin" to your PATH
    to access the "correct" python.

    So doing the following should work:
    export VIRTUAL_ENV="/absolute/path/to/venv"
    export PATH="$VIRTUAL_ENV/bin":$PATH

    But maybe you could come up with an elisp function to more easily
    activate (and deactivate) those.

    I realized that since you can evaluate elisp functions in eshell as you
    would commands, I'm able to run `pyvenv-activate .venv` right in the
    shell. This /almost/ works. `exec-path` shows the correct path and
    `getenv "PATH"` shows the change, but `echo $PATH` does not. Guess
    which one eshell uses.

    If I run `pyvenv-activate .venv` then exit eshell and start it again, everything works. It's not as elegant as I would like, but I guess it
    will have to do.

    I haven't been on usenet in a while and ran across this thread. The
    solution that I went with after a rather lengthy conversation on IRC
    #emacs, was to create an alias called reload in eshell that evaluates `(eshell/export (concat "PATH=" (string-join exec-path ":")))`.
    --
    this is my clever sig.
    --- Synchronet 3.22a-Linux NewsLink 1.2