asdf, direnv and the upgrade to python 3.10
Recently Python Bytes a post mentioned using asdf and direnv to manage Python versions.
I've always looked for a good way to have auto-setting environments and while
virtualenvwrapper did a lot for that. I feel like using pyenv via Homebrew was a step backward, having to initialize
pyenv-virtualenvwrapper every time I opened the terminal felt like I was doing something wrong. I probably was.
That said asdf gives you pyenv-like1 simplicity for running multiple versions of Python (and nvm, and ruby, and other things).
Install Homebrew. We aren't removing it from our setup, just liberating it from programming language version management responsibilities.
Install direnv. Using the
layout command is how we'll create that auto-environment control. layout will create a shim of our requested Python version in the
.direnv directory of our project2.
[Optional] - This blog post is using zsh and ohmyzsh as the environment. It's not required but this post will explain the setup using that.
Install asdf and Python
brew install asdf. If running ohmyzsh, you can add asdf to the list of plugins, otherwise be sure to follow any setup instructions.
You'll also need the asdf-python plugin with
asdf plugin-add python
Next you'll need to install Python through asdf. I recommend completely uninstalling Python via Homebrew. Once that is done you can re-install Python using the command
asdf install python <PYTHON VERSION> you can also use
latest for the Python version if you aren't sure with version is the latest one.
You can verify the python versions installed using
asdf list python. You can verify that asdf installed version of python is default by running
If you have multiple versions installed, you can select the version similar to
asdf global python <PYTHON VERSION>
You can tell which one is set using
Register a Python Environment for Your Project
When you want to create a new project make the directory for that project. Then create a .envrc file and add
layout python <PYTHON VERSION>
I had a recent issue with the
Then you will need to activate direnv using
If I remember correctly it's actually using pyenv to manage the version. I'm too lazy to check. ↩
Also thanks to Jeff Triplett who got me into direnv for directory based environment variables a while ago. ↩
To be fair, at the time of writing the version I was trying to use was less than 24 hours old so things may not have been updated yet. I just tried again before releasing this and the problem has been fixed. ↩