簡體   English   中英

為什么 `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返回/root/.pyenv/versions/test3/bin/python
  • command -v python返回/opt/conda/bin/python
  • 我的 virtualenv 中的$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 :/root/.pyenv/bin:/opt/conda/bin:/app/python/bin:/opt/conda/bin:/ /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包含兩個文件夾: activatedeactivate
  1. 如果你的~/.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

重新啟動您的登錄 session 以使配置文件的更改生效。 例如,如果您在 GUI session 中,則需要完全注銷並重新登錄。

  1. 安裝您需要的版本 python。
pyenv install 3.8.12
  1. 在您的應用程序目錄中激活它
pyenv local 3.8.12
  1. 然后找到python版本
$ pyenv which python
/home/xirehat/.pyenv/versions/3.8.12/bin/python

鑒於您提供給我們的新信息,您很可能在您的~/.profile中(或在您使用 K8s 時在您的 Dockerfile 中)作為/root/.pyenv/shim缺少一個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 上),在 my.zshrc 中我有以下行:

source "/Volumes/G-DRIVE Thunderbolt 3/PythonStuff/venv3.10.2/bin/activate"

因此,將在任何 zsh 實例中使用的 python 可執行文件將基於 venv。

顯然你通往 venv 的道路會有所不同,但你明白了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM