Skip to content

Instantly share code, notes, and snippets.

@markph0204
Created December 26, 2017 21:49
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markph0204/dd97d9d301483fcc2cf458f5e44ff25d to your computer and use it in GitHub Desktop.
Save markph0204/dd97d9d301483fcc2cf458f5e44ff25d to your computer and use it in GitHub Desktop.
direnv with pycharm
# enable direnv for python
# this will enable the commandline support as well as support pycharm
# 1 install direnv (Homebrew / pip)
# 2 edit your .bashrc, .bash_profile or .bash_aliases
function venv-here {
# you could just use 'layout python' here for 2.7.x
echo "layout python3" > .envrc
echo "ln -s .direnv/\$(basename \$VIRTUAL_ENV)/ .env" >> .envrc
}
# sample
# cd to any path, then run...
venv-here
# prompted to run direnv allow
direnv allow
#done!
@gloc-mike
Copy link

gloc-mike commented Feb 16, 2022

Hi,

This gist has been invaluable. Thanks for putting it out there! :)

PyCharm detects & loads my venv, so all good there! :)

But, I have however, been confused by the symbolic link to .direnv in echo "ln -sf .direnv/\$(basename \$VIRTUAL_ENV)/ .env" >> .envrc. I get this message printed, direnv: .env at .env not found, which is the result of runningdotenv .env. Is it just a kludge to get PyCharm to detect and load venv's?

I'm using layout pipenv so any venv's created are actually located in ~/.local/share/virtualenvs/.

I don't find any references to the .direnv file anywhere on my system and it's rather difficult tracking it down on the net too so it would be great if someone could offer an explanation please! :)

Just for reference:

function pipenv-venv {
  echo "pipenv --python $(<.python-version)" > .envrc
  echo "layout pipenv" >> .envrc
  echo "ln -sf .direnv/\$(basename \$VIRTUAL_ENV)/ .env" >> .envrc
  echo "dotenv .env" >> .envrc
}

Thanks again! I really appreciate it!

@markph0204
Copy link
Author

@gloc-mike

Is it just a kludge to get PyCharm to detect and load venv's?

Yes from what I recall -- .env was linked because that is what PyCharm use to only look for.

I don't find any references to the .direnv file anywhere on my system and it's rather difficult tracking it down on the net too so it would be great if someone could offer an explanation please! :)

I think you mean this? https://direnv.net

@gloc-mike
Copy link

Thanks @markph0204 ! I really appreciate your reply. I didn't think you/anyone would get to it so quickly! 🥇 👍

I want to specifically understand why .direnv is being used in this context:
echo "ln -s .direnv/\$(basename \$VIRTUAL_ENV)/ .env" >> .envrc

I looked all through https://direnv.net and only found references to .direnv here in the layout python and layout ruby sections of direnv stdlib.

So I think from that reading, that it looks like a $PWD/.direnv file is only created for those layout types. And since I'm using pipenv, it will not be created.

I did some testing and found that I didn't have to have anything but an empty .env file in my project for PyCharm to detect the pipenv venv.

So now the function can be written differently:

function pipenv-venv {
  echo "pipenv --python $(<.python-version)" > .envrc
  echo "layout pipenv" >> .envrc
  echo "dotenv .env" >> .envrc
  echo "pipenv update" >> .envrc
  # PyCharm fix - an empty .env file
  echo "" > .env
}

Thanks a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment