我已经安装并使用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。