简体   繁体   中英

Failed to activate virtualenv with pyenv

I run:

pyenv activate new_app

And I get:

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

I am trying to follow this tutorial: https://tutorials.technology/tutorials/59-Start-a-flask-project-from-zero-building-api-rest.html

Other info:

bash-3.2$ python --version
Python 3.6.0

bash-3.2$ pyenv version
3.6.0 (set by /Users/me/Projects/flask_api/.python-version)

bash-3.2$ pwd
/Users/me/Projects/flask_api

bash-3.2$ pyenv versions
  system
  3.5.1
  3.5.1/envs/my_env_3_5_1
* 3.6.0 (set by /Users/me/Projects/flask_api/.python-version)
  3.6.0/envs/new_app
  flask_app
  my_env_3_5_1
  new_app

bash-3.2$ virtualenv --version
15.1.0

bash-3.2$ pyenv virtualenvs
3.5.1/envs/my_env_3_5_1 (created from /Users/me/.pyenv/versions/3.5.1)
  3.6.0/envs/new_app (created from /Users/me/.pyenv/versions/3.6.0)
  flask_app (created from /System/Library/Frameworks/Python.framework/Versions/2.7)
  my_env_3_5_1 (created from /Users/me/.pyenv/versions/3.5.1)
  new_app (created from /Users/me/.pyenv/versions/3.6.0)

I recently made my .bash_profile it contains:

bash-3.2$ cat ~/.bash_profile 
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
exec "$SHELL"
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi

What should I do to properly start virtualenv?

That

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

should be in .bashrc , not .bash_profile . The latter is executed only by login shells, the former by all interactive shells.

  1. Add the lines below to your ~/.bash_profile or ~/.zprofile
eval "$(pyenv init -)"  
eval "$(pyenv virtualenv-init -)"
  1. Restart shell or run the command:
source ~/.bash_profile

Note:

If you are using zsh shell (default for macOS Catalina and/or Big Sur ) you have to use ~/.zprofile file rather than ~/.bash_profile

For me the below fixed my problem. I am using MacBook Pro thanks @Kalanos

eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Within ~/.zshrc

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Sadly the init lines alone (mentioned in the pyenv and pyenv-virtualenv instructions) did not work for me

For those who still struggled to get python --version prints out the expected results, after spending few hours like me, here's one solution which works (on MacOS environment, if that matters).

Add these line to your ~/.zshrc or ~/.bash_profile or whatever:

eval "$(pyenv init --path)"  # <-- super important!
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

For context, see https://github.com/pyenv/pyenv/issues/849#issuecomment-875875617 .

For sake of performance I recommend to use conditional initialization not only for this case but for all eval statements in your shell configs [~/.zshrc etc.]

if command -v pyenv 1>/dev/null 2>&1; then
    eval "$(pyenv init --path)"
fi

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM