Git Hooks inside PyCharm running in incorrect environment

Viewed 3600

I have recently started a new project in PyCharm, finally utilizing anaconda environments. However, after trying to make my first commit through PyCharm, it appears to be using my native python, not the environment set in PyCharm. I've tried to restart PyCharm several times, restarted my computer, and reinstalled the virtual environment.

Here is a copy of pre-commit hook:

set -e

# Run linters and tests
source scripts/lint.sh

The linter is the following: (which python has been added to highlight the issue)

set -e
set -v

which python

flake8 ~project name~
mypy ~project name~
pytest -x
black --check --fast --quiet ~project name~

set +v

I am running the commit through PyCharm -> VCS -> Commit. Inside PyCharm, the commit fails

enter image description here (below this are a large amount of mypy errors, but note the environment)

However, if I run the commit from the terminal with $ git commit -m "testing commit" the commit works. It provides the following response:

enter image description here

This is the correct virtual environment inside of the project, seen here: enter image description here

Am I setting something up incorrectly? I vastly prefer PyCharm's VCS and would prefer not to have to use git from the terminal.

5 Answers

Here's what worked for me.

I was getting the following error:

18:37   Commit failed with error
            0 file committed, 1 file failed to commit: Update pre-commit hooks
            env: python3.7: No such file or directory

When I navigated to .git/hooks/pre-commit in my project repo, it turned out that the shebang line is #!/usr/bin/env python3.7.

This was an issue, since calling python3.7 on my MacOS would end up with the following:

zsh: command not found: python3.7

I could have either added a global python3.7 or, alternatively, updated the shebang. I went with the latter one and changed the shebang line to:

#!/usr/bin/env python3

This resolved the issue for me.

It seems that the aforementioned PyCharm ticket won't be fixed soon (it's there since 2014).

This hack below works for me; I added this to the PyCharm ticket:

This is a slightly annoying workaround that works for me:

  1. Close PyCharm.
  2. cd /your/project/dir
  3. Open PyCharm from the command line: PYENV_VERSION="$(pyenv local | head -1)" open /Applications/PyCharm.app/. I'm using macOS, you should adapt the open command to your OS.

I have to do it every time I switch projects, otherwise the pylint pre-commit hook doesn't work. If you have a similar config for your projects (Python version and not using PyLint), just run PyCharm from the CLI once.

You can manually edit the auto-generated pre-commit file (located in your project dir at .git/hooks/pre-commit) to add the path to your virtual environment, replacing:

# start templated
INSTALL_PYTHON = 'PATH/TO/YOUR/ENV/EXECUTABLE'

with

# start templated
INSTALL_PYTHON = 'PATH/TO/YOUR/ENV/EXECUTABLE'
os.environ['PATH'] = f'{os.path.dirname(INSTALL_PYTHON)}{os.pathsep}{os.environ["PATH"]}'

None of the above solutions worked for me: PyCharm 2020.3 on Windows 10

What I did is to rename the .git\hooks\pre-commit -> .git\hooks\pre-commit.py

and created a new .git\hooks\pre-commit with next content:

#!/bin/bash

BASEDIR=$(dirname "$0")
/c/<PATH-to-YOUR-Python>/python.exe $BASEDIR/pre-commit.py $@

Worked as a charm!

Related