pyenv установить с .python-version и .python-virtualen не удается на macOS BigSur

#pyenv #macos-big-sur

#pyenv #macos-биг-сур

Вопрос:

Это лишь частично связано с # 1737

Я только что обновился до новой MAC OS BigSur.

Я установил бета-версию XCode 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/включить » LDFLAGS=»-L $(brew —префикс openssl)/ lib -L $(brew —префикс readline) /lib -L $ (brew —префикс zlib) / lib -L $(brew —префикс 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 Это работает.

Однако я начал использовать pyenv после того, как нашел очень привлекательный способ управления многими окружениями python с помощью автоматической активации, как описано в этом блоге : https://glhuilli.github.io/virtual-environments.html

С тех пор, как я обновился, я не смог заставить это работать.

Вопросы:

  1. Когда я захожу в каталог с .python-version и .python-virtualenv, скрипт предлагает мне создать новую среду с помощью pyenv install. Это приводит к ошибке ./Modules/pwdmodule.c. Как я могу изменить приведенный выше сценарий, чтобы создать среду с использованием .python-version и .python-virtualenv? Очевидно, я могу предоставить другую версию python в скрипте, но как насчет имени виртуальной среды? Как я могу это включить?
  2. Я хочу, чтобы содержимое новой виртуальной среды находилось в каталоге, в котором вызывается pyenv, а не /Users/username/.pyenv. Как это можно сделать? я уверен, что другие сталкиваются с подобными проблемами. Будут ли они исправлены в конце концов? В идеале, я хотел бы иметь возможность просто выполнить установку pyenv и готово…

Заранее спасибо.

Комментарии:

1. Это сработало для меня: dev.to/lgw4 /…

2. Спасибо! Это очень помогло.

Ответ №1:

Итак, о вопросе 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)
 

Это должно успешно установить a pyenv для 3.8.2.

Тогда просто сделайте:

 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>amp;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`) amp;amp; 
    source $MY_ENV/bin/activate
  fi
}
pythonVirtualenvCd () {
  # move to a folder   run the pyenv   virtualenv script
  cd "$@" amp;amp; hasAndSetVirtualenv
}
# Every time you move to a folder, run the pyenv   virtualenv script
alias cd="pythonVirtualenvCd"