我已经安装并使用Pyenv一段时间了,利用Pyenv Virtualenv插件创建venv
s,并根据插件文档通过包含.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
认为正在使用venv
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存储库中找到该代码,我正在使用最新的主(pyenv 2.0.3
)通过Homebrew。
见解吗?
更新似乎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
第一个目录是空的,似乎是达尔文缓存目录的一部分:
$ getconf DARWIN_USER_CACHE_DIR
/var/folders/62/38l28z6j12s9lqp6nnhmrlhc0000gn/C/
我不确定它是如何被附加到我的PATH
(由zsh
?)或者如果它可能以某种方式使shell认为它应该在其他地方找到pip
而不是pyenv
。
我在某些时候也同样感到困惑。原来我用不同的方法安装/升级python和pip (brew, easy_install, curl, sudo…)。这就是为什么我的路变得一团糟。
删除所有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添加到~/的PATH中。ZSHRC或~/。Zshenv,以便得到正确的路径。
echo 'export PATH=$HOME/.pyenv/bin:$PATH' >> ~/.zshenv
我希望有一个更完整的解释,但是安装pip3
解决了这个问题。