使用 .python-version 和 .python-virtualen 的 pyenv 安装在 MacOS BigSur 上失败
pyenv install with .python-version and .python-virtualen fails on MacOS BigSur
这仅与 #1737
部分相关
我刚刚升级到新的 MAC OS BigSur。
我已经安装了 XCode Beta 12.3 并使用 Command Line Tools 12.3 beta 对其进行了配置。
如果我这样做:
$ CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib )/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.8.0 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
按照此博客的说明:https://dev.to/kojikanao/install-python-3-8-0-via-pyenv-on-bigsur-4oee 有效。
然而,在找到一种非常有吸引力的方法来管理许多 python envs 之后,我开始使用 pyenv,如本博客所述:https://glhuilli.github.io/virtual-environments.html
自从我升级后,我一直无法让它工作。
问题:
- 当我 cd 进入带有 .python-version 的目录并且
.python-virtualenv,脚本提示我创建一个新的环境
pyenv 安装。这失败并出现 ./Modules/pwdmodule.c 错误。如何
我可以更改上面的脚本以使用创建环境吗
.python-version 和 .python-virtualenv?我显然可以提供一个
脚本中的 python 版本不同,但是名称呢
虚拟环境?我怎样才能包含它?
- 我想要新的
虚拟环境内容位于所在目录
pyenv 被调用而不是 /Users/username/.pyenv。怎么会这样
完毕?我相信其他人也面临着类似的问题。这些会不会
最终修复了吗?理想情况下,我希望能够只做 pyenv
安装并完成...
提前致谢。
所以,关于问题1: 答案是pyenv install
暂时不行。但是,只要安装了所需的 pyenv version
,该脚本就可以正常工作。所以你必须以不同的方式安装它(不是 pyenv install
)。
示例:
假设给你两个文件:
.python-vesion
.python-virtualenv
分别封装:3.8.2
和test-venv
。然后 运行:
CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include"
LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"
pyenv install --patch $(head -n 1 .python-version) < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
这应该会为 3.8.2 成功安装 pyenv
。
然后就这样做:
pyenv virtualenv $(head -n 1 .python-virtualenv)
那么如果你 运行:
$ pyenv virtualenvs
3.8.2/envs/test-venv (created from /Users/{your-pc-name}/.pyenv/versions/3.8.2)
test-venv (created from /Users/{your-pc-name}/.pyenv/versions/3.8.2)
您将确认新环境已创建。
关于问题 2: 这是更新后的脚本:
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
# Automatic venv activation
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
# Undo any existing alias for `cd`
unalias cd 2>/dev/null
# Method that verifies all requirements and activates the virtualenv
hasAndSetVirtualenv() {
# .python-version is mandatory for .python-virtualenv but not vice versa
if [ -f .python-virtualenv ]; then
if [ ! -f .python-version ]; then
echo "To use .python-virtualenv you need a .python-version"
return 1
fi
fi
# Check if pyenv has the Python version needed.
# If not (or pyenv not available) exit with code 1 and the respective instructions.
if [ -f .python-version ]; then
if [ -z "`which pyenv`" ]; then
echo "Install pyenv see https://github.com/yyuu/pyenv"
return 1
elif [ -n "`pyenv versions 2>&1 | grep 'not installed'`" ]; then
# Message "not installed" is automatically generated by `pyenv versions`
echo 'run "pyenv install"'
return 1
fi
fi
# Create and activate the virtualenv if all conditions above are successful
# Also, if virtualenv is already created, then just activate it.
if [ -f .python-virtualenv ]; then
VIRTUALENV_NAME="`cat .python-virtualenv`"
PYTHON_VERSION="`cat .python-version`"
MY_ENV=$PYENV_ROOT/versions/$PYTHON_VERSION/envs/$VIRTUALENV_NAME
([ -d $MY_ENV ] || virtualenv $MY_ENV -p `which python`) && \
source $MY_ENV/bin/activate
fi
}
pythonVirtualenvCd () {
# move to a folder + run the pyenv + virtualenv script
cd "$@" && hasAndSetVirtualenv
}
# Every time you move to a folder, run the pyenv + virtualenv script
alias cd="pythonVirtualenvCd"
这仅与 #1737
部分相关我刚刚升级到新的 MAC OS BigSur。
我已经安装了 XCode Beta 12.3 并使用 Command Line Tools 12.3 beta 对其进行了配置。
如果我这样做:
$ CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib )/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.8.0 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1) 按照此博客的说明:https://dev.to/kojikanao/install-python-3-8-0-via-pyenv-on-bigsur-4oee 有效。
然而,在找到一种非常有吸引力的方法来管理许多 python envs 之后,我开始使用 pyenv,如本博客所述:https://glhuilli.github.io/virtual-environments.html
自从我升级后,我一直无法让它工作。
问题:
- 当我 cd 进入带有 .python-version 的目录并且 .python-virtualenv,脚本提示我创建一个新的环境 pyenv 安装。这失败并出现 ./Modules/pwdmodule.c 错误。如何 我可以更改上面的脚本以使用创建环境吗 .python-version 和 .python-virtualenv?我显然可以提供一个 脚本中的 python 版本不同,但是名称呢 虚拟环境?我怎样才能包含它?
- 我想要新的 虚拟环境内容位于所在目录 pyenv 被调用而不是 /Users/username/.pyenv。怎么会这样 完毕?我相信其他人也面临着类似的问题。这些会不会 最终修复了吗?理想情况下,我希望能够只做 pyenv 安装并完成...
提前致谢。
所以,关于问题1: 答案是pyenv install
暂时不行。但是,只要安装了所需的 pyenv version
,该脚本就可以正常工作。所以你必须以不同的方式安装它(不是 pyenv install
)。
示例: 假设给你两个文件:
.python-vesion
.python-virtualenv
分别封装:3.8.2
和test-venv
。然后 运行:
CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include"
LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib"
pyenv install --patch $(head -n 1 .python-version) < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
这应该会为 3.8.2 成功安装 pyenv
。
然后就这样做:
pyenv virtualenv $(head -n 1 .python-virtualenv)
那么如果你 运行:
$ pyenv virtualenvs
3.8.2/envs/test-venv (created from /Users/{your-pc-name}/.pyenv/versions/3.8.2)
test-venv (created from /Users/{your-pc-name}/.pyenv/versions/3.8.2)
您将确认新环境已创建。
关于问题 2: 这是更新后的脚本:
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
# Automatic venv activation
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
# Undo any existing alias for `cd`
unalias cd 2>/dev/null
# Method that verifies all requirements and activates the virtualenv
hasAndSetVirtualenv() {
# .python-version is mandatory for .python-virtualenv but not vice versa
if [ -f .python-virtualenv ]; then
if [ ! -f .python-version ]; then
echo "To use .python-virtualenv you need a .python-version"
return 1
fi
fi
# Check if pyenv has the Python version needed.
# If not (or pyenv not available) exit with code 1 and the respective instructions.
if [ -f .python-version ]; then
if [ -z "`which pyenv`" ]; then
echo "Install pyenv see https://github.com/yyuu/pyenv"
return 1
elif [ -n "`pyenv versions 2>&1 | grep 'not installed'`" ]; then
# Message "not installed" is automatically generated by `pyenv versions`
echo 'run "pyenv install"'
return 1
fi
fi
# Create and activate the virtualenv if all conditions above are successful
# Also, if virtualenv is already created, then just activate it.
if [ -f .python-virtualenv ]; then
VIRTUALENV_NAME="`cat .python-virtualenv`"
PYTHON_VERSION="`cat .python-version`"
MY_ENV=$PYENV_ROOT/versions/$PYTHON_VERSION/envs/$VIRTUALENV_NAME
([ -d $MY_ENV ] || virtualenv $MY_ENV -p `which python`) && \
source $MY_ENV/bin/activate
fi
}
pythonVirtualenvCd () {
# move to a folder + run the pyenv + virtualenv script
cd "$@" && hasAndSetVirtualenv
}
# Every time you move to a folder, run the pyenv + virtualenv script
alias cd="pythonVirtualenvCd"