我想用pyenv来切换python2和python3。
我成功下载了python2和python3和pyenv下面的代码。
brew install pyenv
brew install pyenv-virtualenv
pyenv install 2.7.10
pyenv install 3.5.0
但是,我不能从python2切换到python3..
Soma-Suzuki:~ Soma$ python --version
Python 2.7.10
Soma-Suzuki:~ Soma$ pyenv global
2.7.10
Soma-Suzuki:~ Soma$ pyenv versions
system
* 2.7.10 (set by /Users/Soma/.pyenv/version)
3.5.0
Soma-Suzuki:~ Soma$ pyenv global 3.5.0
Soma-Suzuki:~ Soma$ pyenv global
3.5.0
Soma-Suzuki:~ Soma$ pyenv versions
system
2.7.10
* 3.5.0 (set by /Users/Soma/.pyenv/version)
Soma-Suzuki:~ Soma$ python --version
Python 2.7.10
Soma-Suzuki:~ Soma$
我不明白为什么会这样。
我的python在这个目录中。
Soma-Suzuki:~ Soma$ which python
/usr/bin/python
这个答案只适用于使用Fish shell并找到此线程的人。Pyenv使用shims, ref,所以为了让Pyenv与你的fish shell一起工作,你必须编辑你的~/.config/fish/config。fish文件在$PATH变量的开头追加pyen shim目录。这是我的配置。鱼看起来像。
### PATH ###
set default_path /usr/local/bin /usr/bin /usr/sbin /bin /sbin
set macports /opt/local/bin
set androiddev ~/Android\ Development/platform-tools/
set rbenv ~/.rbenv/shims/
set pyenv ~/.pyenv/shims/
set anaconda /Users/m4punk/anaconda/bin/
set pg_config /Applications/Postgres.app/Contents/Versions/9.5/bin/
### Virtual Enviroment Wrapper ###
set -g VIRTUALFISH_HOME ~/Documents/Coding/python/virtualenvs
set -g VIRTUALFISH_DEFAULT_PYTHON /usr/local/bin/python3
eval (python -m virtualfish)
### NVM Settings ###
set -g NVM_DIR ~/.nvm
set -gx PATH $pyenv $default_path $macports $androiddev $rbenv $pg_config
setenv EDITOR sublime
这里的相关行是
set pyenv ~/.pyenv/shims/
and
set -gx PATH $pyenv $default_path $macports $androiddev $rbenv $pg_config
第一个函数为pyenv shim路径创建一个变量,第二个函数将它添加到路径变量的前面。只需保存并关闭,重新启动终端会话,你应该都设置好了。
我遇到了同样的问题,并最终对pyenv init设置shell的方式进行了一些更改,但最终它的工作原理是一样的。与pyenv github页面上的指南唯一真正的区别是,我必须将$(pyenv root)/bin目录也添加到我的路径中。
我这样做的原因是为了避免运行eval "$(pyenv init -)"和所有其他进入本地shell环境的.bash_profile工作所需的长时间shell启动时间。明确一点;在我看来,Pyenv本身并没有带来糟糕的shell体验,但是当您使用几种语言时,它们都有自己的版本管理系统和工具,并且喜欢使用Pyenv等从.profile进行初始化,shell初始化过程可能会变得很慢。
下面是我从高处观察自己的步骤:
运行pyenv init命令的干运行版本,这样您就可以看到
对你有什么好处。
将PATH和shell环境变量放到.bash_profile中
(或者你的发行版使用的任何文件)。
将pyenv init函数打印到你的.bashrc并源你的.bashrc
从您的.bash_profile
这是完成它的一种方法,但最好将其作为“伪代码”使用。你应该把.bash_profile换成你的发行版喜欢的任何文件。
$ pyenv init - # use the output for reference, it doesn't actually do anything
$ cat <<EOBP > ~/.bash_profile
export PYENV_SHELL=bash
PATH=$(pyenv root)/shims:$(pyenv root)/bin:$PATH
[ -f /usr/local/Cellar/pyenv/1.2.9/completions/pyenv.bash ] && . /usr/local/Cellar/pyenv/1.2.9/completions/pyenv.bash
[ -f ~/.bashrc ] && . ~/.bashrc
EOBP
下一部分使用我们从上面第1步的pyenv init演练中复制的新逻辑更新shell。
$ cat <<EORC > ~/.bashrc
# from $(pyenv init -)
pyenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "$(pyenv "sh-$command" "$@")";;
*)
command pyenv "$command" "$@";;
esac
}
EORC
这是一个了解pyenv工作原理的好机会。
pyenv global命令只是读取/Users/Soma/中的数据。pyenv /版本目录中。基本上和cat /Users/Soma/.pyenv/version一样。
pyenv versions命令只是检查层次结构,并在运行Python或pip等“shim interceptable”命令时选择正确的Python版本。
当您运行pyenv global 3.5.0时,/Users/Soma/。Pyenv /version文件更新为包含“3.5.0”。这是pyenv所做的唯一更改。大多数用户都很惊讶pyenv global 3.5.0只改变了文本文件中的一行!
当你运行python——version时,你的终端将执行与执行任何shell命令时相同的步骤:它遍历PATH中的每个目录并寻找第一个名为python的可执行文件。
如果你输入echo $PATH,你会得到这样的东西:/usr/ local/bin:/usr/bin:/bin:/usr/sbin:/sbin
您的机器在/usr/bin目录中找到python可执行文件。
您可以将此代码添加到~/。bash_profile文件来更改PATH。
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
重新启动您的终端,再次运行echo $PATH,现在您将看到如下输出:/ Users/Soma/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
注意/Users/Soma/。pyenv/shims目录现在在PATH的开始。当您现在运行python——version时,该命令将由/Users/Soma/.pyenv/shims中的python可执行文件处理。该命令将没有机会被/usr/bin/python捕获,因为它将被/Users/Soma/捕获。pyenv /垫片/ python。
我知道为什么这个虫子让你困惑了。除非您知道pyenv是如何工作的,否则很难进行调试。
仅供参考,如果你的可执行文件早于pyenv的shim位置,那么当你在shell中键入python时,你将无法更改python版本。
要正确使用pyenv, shim目录应该是PATH变量中的第一个内容。例如,
如果你的PATH看起来像
/usr/bin:/home/kenobi/.pyenv/shims:...
如果你在/usr/bin中有一个python可执行文件,你将不能正确使用pyenv。您应该在~/中安排您的PATH配置。Bashrc如下图
/home/kenobi/.pyenv/shims:/usr/bin:...
然后重新启动shell,就不会有问题了。
对我来说,我在~/.zshrc中有这些行
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH" # This line was causing the problem
eval "$(pyenv init --path)"
# Docker
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
正如您所看到的,我在pyenv配置行之后设置了export PATH=/usr/bin:$PATH。然后我通过像下面这样切换块来解决这个问题
# Docker
export PATH=/usr/bin:$PATH # Not a problem anymore.
export DOCKER_HOST=unix:///run/user/1000/docker.sock
# PyEnv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
(2021年7月)
如果您在运行eval "$(pyenv init -)"时看到此消息
WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.
您应该像警告所说的那样检查pyenv init的消息,但简而言之,您可以使用eval "$(pyenv init——path)"来代替。
不要忘记相应地更新~/。bash_profile、~ /。zprofile ~ /。bashrc,(~ /。ZSHRC或类似文件(如有需要)。
存在不能更新~/的情况。Bashrc或~/。Bash_profile,因为机器是共享的。在这种情况下,向bash脚本中添加eval "$(pyenv init——path)"仍然可以工作,因为pyenv init将pyenv shims的路径添加到$ path中。例如,pyenv将执行如下命令:
export PATH="/path/to/.pyenv/shims:${PATH}"
希望这能解释为什么它是有效的。或者,可以将/路径/导出到/。Pyenv /shims在他们的bash脚本中,它应该允许Pyenv切换python版本。
我还面临着eval "$(pyenv init -)"确实帮助将python版本切换到3.8.8的情况。但是当我启动一个虚拟环境时,虚拟环境创建中的python版本会失败:
virtualenv "$VENV_PATH" -p 3.8.8
RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.8.8'
但是通过eval "$(pyenv init——path)",虚拟环境也得到了3.8.8。python的版本。
假设你是MacOS用户……
Run
pyenv init
要得到这个建议:
# See the README for instructions on how to set up
# your shell environment for Pyenv.
所以,去https://github.com/pyenv/pyenv#readme获取这个小贴士吧:
Zsh:
MacOS,如果Pyenv安装了Homebrew:
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
确保你的终端
应用程序将shell作为登录shell运行。
适用于macOS Monterey 12.0.1和pyenv 2.2.0。
Pyenv通过brew安装,python通过Pyenv install安装。
我用brew安装了pyenv和pyenv-virtualenv,也遇到了同样的问题。
在你知道该怎么做之后就很容易解决了:
1-你需要知道你在使用什么shell解释器。直接引用自https://support.apple.com/en-us/HT208050
默认情况下,Mac使用zsh或bash作为命令行
登录shell和交互shell的解释器:
zsh (Z shell)是所有新创建的用户帐户的默认shell,从macOS Catalina开始。
bash是macOS Mojave及更早版本的默认shell。
当然,每个解释器都为环境变量使用不同的文件,如PATH、JAVA_HOME等。
bash使用$HOME/。bash_profile和$HOME/。而zsh使用$HOME/。$HOME/.zshrc
2-在安装pyenv和安装你想要使用的python版本(例如pyenv install 3.y)之后,打开/。Bash_profile或/。Zprofile文件WRT你的解释器。
注1:我使用bash解释器和我的$HOME/。Bashrc文件为空。我不知道会发生什么不管/中的PATH声明。Bashrc会影响/。是否声明Bash_profile。你可能需要检查一下。
pyenv创建$HOME/。Pyenv /shims目录,并使用它来切换您安装的python版本。
因此,您只需要在底部添加以下一行(不一定是文件的最底部)。你只需要走到所有PATH声明的末尾。)
export PATH=$HOME/.pyenv/shims:$PATH
注2:“$ HOME /。pyenv/shims"必须在PATH变量的开头。因为解释器从左到右读取所有路径。因此,将来要小心向PATH变量添加新路径。
Note3: There are two commands that sets python version. One is "pyenv global #python_version_here#" and the other is "pyenv local #python_version_here#". Under a directory, hierarchically "local" command is top of "global" one. So, if you run the "local" command under $HOME directory, you cannot change the global python version with the "global" command. In that case, either
1- You can continue to use "local" command under the $HOME directory
2- Delete $HOME/.python-version file and return to "global" setting
这是我的shell输出来显示这个层次结构:
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv global system
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.pyenv/version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv local system
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.python-version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv global 3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
* system (set by /Users/ozgurcengelli/.python-version) #look the path
3.6.15
Ozgurs-MacBook-Pro:~ ozgurcengelli$ rm $HOME/.python-version
Ozgurs-MacBook-Pro:~ ozgurcengelli$ pyenv versions
system
* 3.6.15 (set by /Users/ozgurcengelli/.pyenv/version) #look the path