3

我已经安装并使用Pyenv一段时间了,利用Pyenv Virtualenv插件创建venvs 并通过包含.python-version插件文档自动激活。

不过,它似乎并不总是按预期工作。最近将 OSX 升级到 Big Sur。

Pip 似乎正在全局安装软件包,而不是安装到venv

pyenv versions
  system
  2.7.17
  3.8.5
  3.9.5
* 3.9.5/envs/project_venv (set by /Volumes/path_to_my_project/.python-version)
  fulfill

到目前为止,一切都很好。

pyenv which pip
/Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/bin/pip

正如我所料。

这就是我感到困惑的地方:

外面venv

$ pyenv which pip
/Users/mikekilmer/.pyenv/versions/3.8.5/bin/pip
$ pip list -v
Package           Version   Location                                                      Installer
----------------- --------- ------------------------------------------------------------- ---------
# all the global pip packages...
defusedxml        0.7.1     /usr/local/lib/python3.9/site-packages                        pip
# No Django, which is good
idna              2.10      /usr/local/lib/python3.9/site-packages                        pip

内部venv

$ pip install django
# installation output...
$ pip list -v
# abridged
Django            3.2.5     /usr/local/lib/python3.9/site-packages                        pip
## That's not supposed to be in the global packages!!!

当然 Django 也在全球范围内pip list

可是等等...

看这个:

$ /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/bin/pip install django
# installation output...
$ /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/bin/pip list -v
asgiref    3.4.1   /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip
Django     3.2.5   /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip
pip        21.1.1  /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip
pytz       2021.1  /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip
setuptools 56.0.0  /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip
sqlparse   0.4.1   /Users/mikekilmer/.pyenv/versions/3.9.5/envs/project_venv/lib/python3.9/site-packages pip

现在它已安装到正确的位置。

但这不是它应该工作的方式,不是吗?似乎不知何故,pyenv 认为它正在使用venvpip,但不是。

当我运行时which pyenv,它返回这个函数:

pyenv () {
    local command
    command="${1:-}"
    if [ "$#" -gt 0 ]
    then
        shift
    fi
    case "$command" in
        (activate | deactivate | rehash | shell) eval "$(pyenv "sh-$command" "$@")" ;;
        (*) command pyenv "$command" "$@" ;;
    esac
}

我在pyenv 存储库中没有找到该代码,并且我正在pyenv 2.0.3通过 Homebrew 使用最新的 master ()。

有什么见解吗?

更新

似乎pip符号链接到/usr/local/bin/pip3

$ which pip
pip: aliased to /usr/local/bin/pip3

虽然pip3正确指向该pyenv位置:

$ which pip3
/Users/mikekilmer/.pyenv/shims/pip3

$PATH像这样开始:

/var/folders/62/38l28z6j12s9lqp6nnhmrlhc0000gn/T//zsh-501/bin:/usr/local/Cellar/pyenv-virtualenv/1.1.5/shims:/Users/mikekilmer/.pyenv/shims:/Users/mikekilmer/.pyenv/bin

第一个目录是空的,似乎是Darwin 缓存目录的一部分:

$ getconf DARWIN_USER_CACHE_DIR
/var/folders/62/38l28z6j12s9lqp6nnhmrlhc0000gn/C/

我不确定它是如何附加到我的PATH(by zsh?) 的,或者它是否可能以某种方式使 shell 认为它应该在pip其他地方找到而不是 with pyenv

4

2 回答 2

1

在某些时候,我同样感到困惑。原来我用不同的方法(brew、easy_install、curl、sudo ...)安装/升级了python和pip。这就是为什么我的道路一团糟。


到处删除 pip 并重新安装它有帮助。

当我运行时which pyenv,它返回这个函数:

pyenv () {
    local command
    command="${1:-}"
    if [ "$#" -gt 0 ]
    then
        shift
    fi
    case "$command" in
        (activate | deactivate | rehash | shell) eval "$(pyenv "sh-$command" "$@")" ;;
        (*) command pyenv "$command" "$@" ;;
    esac
}

您可以将 pyenv 添加到 ~/.zshrc 或 ~/.zshenv 中的 PATH 以获得正确的路径。

echo 'export PATH=$HOME/.pyenv/bin:$PATH' >> ~/.zshenv
于 2021-12-30T13:57:16.900 回答
0

我希望有一个更完整的解释,但安装pip3解决了这个问题。

于 2021-09-11T21:18:01.027 回答