pip 和 python 指的是不同的解释器

pip and python referring to different interpreters

我知道“multiple-versions-of-python-mess”并不是什么新鲜事,但我的问题更具体。我正在学习如何使用 venv(和 pyenv 等),但我 运行 遇到了一个奇怪的情况。

我安装了 python 的多个不同版本(就像一个一样)。我使用其中一个,3.9,来创建一个 venv:

$ /usr/local/Cellar/python@3.9/3.9.12_1/bin/python3 -m venv ./venvpractice

然后我激活它:

cd venvpractice
$ source bin/activate

这里是“麻烦”开始的地方:

(venvpractice) $ which python
~/venvpractice/bin/python

(venvpractice) $ which python3
python3: aliased to /usr/local/bin/python3

(venvpractice) $ which pip
pip: aliased to /usr/local/bin/pip3

(venvpractice) $ which pip3
~/venvpractice/bin/pip3

您不希望 pippython 匹配(即来自同一个地方),并且 pip3python3 也匹配吗?为什么都乱七八糟的?

我知道这不是最重要的。我应该小心并确保我调用了正确的,比如,当我调用 pip3 freeze > requirements.txt 时。但我只想了解幕后发生的事情。我觉得事情仍然一团糟。 /.zshrc 中有如此多的版本、别名、符号链接和 PATH 变量...然后 pyenv 我也尝试了一下...

请帮忙?!

venv 不会 unalias 给你任何东西;如果你有别名,你的 shell 会在 venv 有机会之前解释那些。

我的简单建议是从 shell 的启动文件中删除这些别名,或者至少暂时 unalias 以交互方式删除它们。

如果你需要一个别名,试试

alias python3='env python3'

这应该在虚拟环境中和虚拟环境中做正确的事情(前提是您的 PATH 适度清醒,并且您有 /usr/local/bin/python3 指向 /usr/local/bin/python)。

(尽管在其他新闻中,别名不如 shell 函数。对于这种简单的情况,mmmmmaybe 可以使用别名。)

稍微复杂一点的函数可能看起来像

python () {
    case ${VIRTUAL_ENV-} in
      '') /usr/local/bin/python "$@" ;;
      *) command python "$@";;
    esac
}

但最终,如果您无论如何都在使用 pyenv,可能只是让开它,让它为您处理这些事情;它做得很好而且透明。