I have personally seen a couple of things cause this issue.
The first is when I had Anaconda installed as well. I had to move the pyenv config block after the Anaconda one. This fixed the issue in that case.
In the second instance I found this issue that led me to figure out how to get it working again:
https://github.com/pyenv/pyenv/issues/2026
Basically I had this line in my config file (.zshrc in my case, since I am using ZSH) initially:
eval "$(pyenv init -)"
Then I changed it to this, just added the first line, and it resolved the issue in my case.
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
There are details about this in the advanced configuration sections of the pyenv README here:
https://github.com/pyenv/pyenv#advanced-configuration
Below is a copy of the section:
Advanced Configuration
Skip this section unless you must know what every line in your shell profile is doing.
pyenv init is the only command that crosses the line of loading extra commands into your shell. Coming from RVM, some of you might be opposed to this idea.
Also see the Environment variables section for the environment variables that control Pyenv's behavior.
eval "$(pyenv init --path)":
Sets up your shims path. This is the only requirement for pyenv to function properly. You can do this by hand by prepending $(pyenv root)/shims to your $PATH.
eval "$(pyenv init --path)" is supposed to be run in your session's login shell startup script -- so that all processes in the session get access to Pyenv's functionality and it only runs once, avoiding breaking PATH in nested shells (e.g. shells started from editors/IDEs).
In Linux, GUI managers typically act as a sh login shell, running /etc/profile and ~/.profile at their startup. MacOS' GUI doesn't do that, so its terminal emulator apps run their shells as login shells by default to compensate.
eval "$(pyenv init -)":
Installs autocompletion. This is entirely optional but pretty useful. Sourcing $(pyenv root)/completions/pyenv.bash will set that up. There is also a $(pyenv root)/completions/pyenv.zsh for Zsh users.
Rehashes shims. From time to time you'll need to rebuild your shim files. Doing this on init makes sure everything is up to date. You can always run pyenv rehash manually.
Installs pyenv into the current shell as a shell function. This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like pyenv shell possible. The sh dispatcher doesn't do anything crazy like override cd or hack your shell prompt, but if for some reason you need pyenv to be a real script rather than a shell function, you can safely skip it.
eval "$(pyenv init -)" is supposed to run at any interactive shell's startup (including nested shells) so that you get completion and convenience shell functions.
To see exactly what happens under the hood for yourself, run pyenv init - or pyenv init --path.
If you don't want to use pyenv init and shims, you can still benefit from pyenv's ability to install Python versions for you. Just run pyenv install and you will find versions installed in $(pyenv root)/versions, which you can manually execute or symlink as required.