为什么 `python` 指向我系统的默认 python 解释器,而不是我的 `pyenv` python 解释器?
Why does `python` point to my system's default python interpreter, instead of my `pyenv` python interpreter?
python
指向我系统的默认 python 解释器,而不是我的 pyenv
python 解释器。
我创建了python虚拟环境并激活如下:
pyenv virtualenv 3.8.12 test3
pyenv activate test3
然后,运行 python
给我一个 python 3.7 解释器(这是我系统的默认 python 解释器),而不是 3.8.12。为什么?
完整命令输出:
root@server:/home/code-base/f# pyenv virtualenv 3.8.12 test3
Looking in links: /tmp/tmp1yp95sav
Requirement already satisfied: setuptools in /root/.pyenv/versions/3.8.12/envs/test3/lib/python3.8/site-packages (56.0.0)
Requirement already satisfied: pip in /root/.pyenv/versions/3.8.12/envs/test3/lib/python3.8/site-packages (21.1.1)
root@server:/home/code-base/f# pyenv activate test3
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(test3) root@server:/home/code-base/f# python
Python 3.7.11 (default, Jul 27 2021, 14:32:16)
[GCC 7.5.0] :: Anaconda, Inc. on linux
另外:
pyenv which python
returns /root/.pyenv/versions/test3/bin/python
command -v python
returns /opt/conda/bin/python
$PATH
在我的虚拟环境中:/root/.pyenv/plugins/pyenv-virtualenv/shims:/root/.pyenv/bin:/opt/conda/bin:/app/python/bin:/opt/conda/bin:/usr/local/mpi/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin
ls -la /root/.pyenv/plugins/pyenv-virtualenv/shims
包含两个文件夹:activate
和 deactivate
。
- 如果您的
~/.profile
来源 ~/.bashrc
(Debian、Ubuntu、Mint):
sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"
a \
' -e ':a' -e '$!{n;ba};}' ~/.profile
echo 'eval "$(pyenv init --path)"' >>~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
重新启动您的登录会话以使对配置文件的更改生效。例如。如果您处于 GUI 会话中,则需要完全注销并重新登录。
- 安装您需要的 python 版本。
pyenv install 3.8.12
- 在您的应用程序目录中激活它
pyenv local 3.8.12
- 然后找到python版本
$ pyenv which python
/home/xirehat/.pyenv/versions/3.8.12/bin/python
鉴于您提供给我们的新信息,您的 ~/.profile
(或您使用 K8s 时在 Dockerfile 中)很可能缺少 eval "$(pyenv init --path)"
作为 /root/.pyenv/shim
不属于 $PATH
.
旧答案:
这里有两种可能的解决方案:
要么你没有 select 你的 3.8.12 二进制文件作为系统默认值通过:
$ pyenv global 3.8.12
$ python -V
Python 3.8.12
$ pyenv versions
system
2.7.15
* 3.8.12 (set by /home/realpython/.pyenv/version)
或 /opt/conda/bin/
在你的 $PATH
中比你的 pyenv 安装有更高的优先级。
创建虚拟环境后,您需要激活它。在虚拟环境的 bin 目录中有一个 shell 脚本,您需要获取它。
例如,我的默认 shell 是 zsh(在 macOS 上)并且在我的 .zshrc 中有以下行:
source "/Volumes/G-DRIVE Thunderbolt 3/PythonStuff/venv3.10.2/bin/activate"
因此,将在任何 zsh 实例中使用的 python 可执行文件将基于 venv。
显然你通往 venv 的路径会有所不同,但你明白了。
python
指向我系统的默认 python 解释器,而不是我的 pyenv
python 解释器。
我创建了python虚拟环境并激活如下:
pyenv virtualenv 3.8.12 test3
pyenv activate test3
然后,运行 python
给我一个 python 3.7 解释器(这是我系统的默认 python 解释器),而不是 3.8.12。为什么?
完整命令输出:
root@server:/home/code-base/f# pyenv virtualenv 3.8.12 test3
Looking in links: /tmp/tmp1yp95sav
Requirement already satisfied: setuptools in /root/.pyenv/versions/3.8.12/envs/test3/lib/python3.8/site-packages (56.0.0)
Requirement already satisfied: pip in /root/.pyenv/versions/3.8.12/envs/test3/lib/python3.8/site-packages (21.1.1)
root@server:/home/code-base/f# pyenv activate test3
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(test3) root@server:/home/code-base/f# python
Python 3.7.11 (default, Jul 27 2021, 14:32:16)
[GCC 7.5.0] :: Anaconda, Inc. on linux
另外:
pyenv which python
returns/root/.pyenv/versions/test3/bin/python
command -v python
returns/opt/conda/bin/python
$PATH
在我的虚拟环境中:/root/.pyenv/plugins/pyenv-virtualenv/shims:/root/.pyenv/bin:/opt/conda/bin:/app/python/bin:/opt/conda/bin:/usr/local/mpi/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin
ls -la /root/.pyenv/plugins/pyenv-virtualenv/shims
包含两个文件夹:activate
和deactivate
。
- 如果您的
~/.profile
来源~/.bashrc
(Debian、Ubuntu、Mint):
sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"
a \
' -e ':a' -e '$!{n;ba};}' ~/.profile
echo 'eval "$(pyenv init --path)"' >>~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
重新启动您的登录会话以使对配置文件的更改生效。例如。如果您处于 GUI 会话中,则需要完全注销并重新登录。
- 安装您需要的 python 版本。
pyenv install 3.8.12
- 在您的应用程序目录中激活它
pyenv local 3.8.12
- 然后找到python版本
$ pyenv which python
/home/xirehat/.pyenv/versions/3.8.12/bin/python
鉴于您提供给我们的新信息,您的 ~/.profile
(或您使用 K8s 时在 Dockerfile 中)很可能缺少 eval "$(pyenv init --path)"
作为 /root/.pyenv/shim
不属于 $PATH
.
旧答案:
这里有两种可能的解决方案:
要么你没有 select 你的 3.8.12 二进制文件作为系统默认值通过:
$ pyenv global 3.8.12
$ python -V
Python 3.8.12
$ pyenv versions
system
2.7.15
* 3.8.12 (set by /home/realpython/.pyenv/version)
或 /opt/conda/bin/
在你的 $PATH
中比你的 pyenv 安装有更高的优先级。
创建虚拟环境后,您需要激活它。在虚拟环境的 bin 目录中有一个 shell 脚本,您需要获取它。
例如,我的默认 shell 是 zsh(在 macOS 上)并且在我的 .zshrc 中有以下行:
source "/Volumes/G-DRIVE Thunderbolt 3/PythonStuff/venv3.10.2/bin/activate"
因此,将在任何 zsh 实例中使用的 python 可执行文件将基于 venv。
显然你通往 venv 的路径会有所不同,但你明白了。