在 MacOS BigSur 上使用 .python-version 和 .python-virtualen 安装 pyenv 失败

Posted

技术标签:

【中文标题】在 MacOS BigSur 上使用 .python-version 和 .python-virtualen 安装 pyenv 失败【英文标题】:pyenv install with .python-version and .python-virtualen fails on MacOS BigSur 【发布时间】:2020-11-22 22:58:54 【问题描述】:

这只是部分与#1737相关

我刚刚升级到新的 MAC OS BigSur。

我已经安装了 XCode Beta 12.3 并使用命令行工具 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 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 安装并完成...

提前致谢。

【问题讨论】:

这对我有用:dev.to/lgw4/… 谢谢!这帮助很大。 【参考方案1】:

所以,关于问题 1: 答案是 pyenv install 目前不起作用。但是,只要安装了所需的pyenv version,脚本就会像魅力一样工作。所以你必须以不同的方式安装它(不是pyenv install)。

示例: 假设给你两个文件:

.python-vesion
.python-virtualenv

分别封装:3.8.2test-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"

【讨论】:

以上是关于在 MacOS BigSur 上使用 .python-version 和 .python-virtualen 安装 pyenv 失败的主要内容,如果未能解决你的问题,请参考以下文章

在 MacOS BigSur 上使用 .python-version 和 .python-virtualen 安装 pyenv 失败

Xcode 13.0 在 macOS BigSur 11.6 上安装时卡住

如何使用 1 个数据卷和 2 个 MacOS 版本?

新版macOS发布 界面重新设计 Safari浏览器有巨大升级

macOS (BigSur) - 安装 MySQL ODBC 驱动程序以将 mysql db 连接到 Tableau

xampp文件无法在macos bigsur中解压缩[关闭]