DEV Community

Jay
Jay

Posted on • Originally published at jay.gooby.org on

asdf, python and automatically enabling virtual envs

I've switched wholly to asdf for all my projects now, both work and personal, thanks to @emma who first put me on to it. In the day job, it's used for managing ruby and node versions with the asdf-ruby and asdf-nodejs plugins.

I've started to use the asdf-python plugin here on this blog, as I have a small python script I use to extract my music posts from Slack to archive to my Music I've liked page.

When I first switched over, everything stopped working, because I'd forgotten to first enable the python virtual env by calling source env/bin/activate. I've since forgotten to do this a couple of times, so it's time to automate!

autoenv will run commands in a .env file when you cd into a directory, and will also run any in .env.leave when you cd out, so it's perfect for setting and unsetting your python env.

I installed autoenv, and created the .env and .env.leave files:

echo -e "AUTOENV_ENABLE_LEAVE=1\nsource \"$AUTOENV_CUR_DIR/env/bin/activate\"" > .env
echo deactivate > .env.leave
Enter fullscreen mode Exit fullscreen mode

Then when you next cd into your project folder, you'll be prompted:

autoenv:
autoenv: WARNING:
autoenv: This is the first time you are about to source /Users/jay/Library/CloudStorage/Dropbox/Work/gooby.org/2021/2021.gooby.org/.env:
autoenv:
autoenv:   --- (begin contents) ---------------------------------------
autoenv:     AUTOENV_ENABLE_LEAVE=1$
autoenv:     source "$AUTOENV_CUR_DIR/env/bin/activate"$
autoenv:
autoenv:   --- (end contents) -----------------------------------------
autoenv:
autoenv: Are you sure you want to allow this? (y/N)
Enter fullscreen mode Exit fullscreen mode

to check you really want to run that .env in the future. Ditto the first time you cd out of the project1:

autoenv:
autoenv: WARNING:
autoenv: This is the first time you are about to source /Users/jay/Work/gooby.org/2021/2021.gooby.org/.env.leave:
autoenv:
autoenv:   --- (begin contents) ---------------------------------------
autoenv:     deactivate$
autoenv:
autoenv:   --- (end contents) -----------------------------------------
autoenv:
autoenv: Are you sure you want to allow this? (y/N)
Enter fullscreen mode Exit fullscreen mode

From then on, you won't see the prompts again. You can hide them completely if you add AUTOENV_ASSUME_YES=1 to the top of both .env and .env.leave.


  1. Because we're passing the full path to activate in the .env file using source "$AUTOENV_CUR_DIR/env/bin/activate", if we cd within the project folder structure, we'll still keep our activated environment, because autoenv looks for a parent .env file. If we just had source env/bin/activate then we'd lose the environment activation, because the path to env/bin/activate is relative and would no longer be correct. 

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay