5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pyenv の activate って何? ( pyenv shell との違い )

Last updated at Posted at 2018-07-05

pyenv activate コマンドは pyenv-virtualenv プラグインによる追加コマンド。

pyenv shell とだいたい同じことをするが、シェルのために色々やってくれるっぽい。(曖昧な理解)

一時的に virtualenv の特定環境を使う場合は pyenv activate を叩いたら良さそう。

コマンド

  • pyenv activate [viatualenvの環境名] で有効化
  • pyenv deactivate で無効化

特に分かりやすいのは、 activate した時にシェルに virtualenv の名前を表示してくれるところ。

image.png

自動化

自動アクティベートを有効化することで、 pyenv shell などで環境を切り替えた時も、自動でアクティベートしてくれる模様。

$ eval "$(pyenv virtualenv-init -)"

( ドキュメントのとおりだが ~/.bash_profile などに記述しておくと良い )

ヘルプ

Usage: pyenv activate <virtualenv>
       pyenv activate --unset

Activate a Python virtualenv environment in current shell.
This acts almost as same as `pyenv shell`, but this invokes the `activate`
script in your shell.

<virtualenv> should be a string matching a Python version known to pyenv.

activate スクリプトの中身

シェルの種類や環境などによって色々やってくれていそう。

/usr/local/bin/pyenv-sh-activate
#!/usr/bin/env bash
#
# Summary: Activate virtual environment
#
# Usage: pyenv activate <virtualenv>
#        pyenv activate --unset
#
# Activate a Python virtualenv environment in current shell.
# This acts almost as same as `pyenv shell`, but this invokes the `activate`
# script in your shell.
#
# <virtualenv> should be a string matching a Python version known to pyenv.

set -e
[ -n "$PYENV_DEBUG" ] && set -x

if [ -z "${PYENV_ROOT}" ]; then
  PYENV_ROOT="$(pyenv-root)"
fi

resolve_link() {
  $(type -p greadlink readlink | head -1) "$1"
}

unset FORCE
unset QUIET

while [ $# -gt 0 ]; do
  case "$1" in
  "--complete" )
    # Provide pyenv completions
    echo --unset
    exec pyenv-virtualenvs --bare
    ;;
  "-f" | "--force" )
    FORCE=1
    ;;
  "-q" | "--quiet" )
    QUIET=1
    ;;
  "--unset" )
    exec pyenv-sh-deactivate
    ;;
  "-v" | "--verbose" )
    unset QUIET
    PYENV_VIRTUALENV_VERBOSE_ACTIVATE=1
    ;;
  * )
    break
    ;;
  esac
  shift 1
done

no_shell=
versions=("$@")
if [ -z "${versions}" ]; then
  no_shell=1
  OLDIFS="$IFS"
  IFS=: versions=($(pyenv-version-name 2>/dev/null))
  IFS="$OLDIFS"
fi

if [ -z "${PYENV_VIRTUALENV_INIT}" ]; then
  # Backward compatibility issue
  # https://github.com/yyuu/pyenv-virtualenv/issues/26
  no_shell=
fi

venv="${versions}"

if [ -n "${VIRTUAL_ENV}" ]; then
  # exit as success if some virtualenv is already activated outside from pyenv-virtualenv
  if [ -z "${PYENV_VIRTUAL_ENV}" ]; then
    if [ -z "${FORCE}" ]; then
      if [ -z "${QUIET}" ]; then
        echo "pyenv-virtualenv: virtualenv \`${VIRTUAL_ENV}' is already activated" 1>&2
      fi
      echo "true"
      exit 0
    fi
  fi
fi

if ! pyenv-virtualenv-prefix "${venv}" 1>/dev/null 2>&1; then
  # fallback to virtualenv of current version
  OLDIFS="$IFS"
  IFS=: current_versions=($(pyenv-version-name))
  IFS="$OLDIFS"
  new_venv="${current_versions%/envs/*}/envs/${venv}"
  if pyenv-virtualenv-prefix "${new_venv}" 1>/dev/null 2>&1; then
    venv="${new_venv}"
    versions[0]="${new_venv}"
  else
    if [ -z "${QUIET}" ]; then
      echo "pyenv-virtualenv: version \`${venv}' is not a virtualenv" 1>&2
    fi
    echo "false"
    exit 1
  fi
fi

# exit as error if there are multiple virtualenvs
# https://github.com/yyuu/pyenv-virtualenv/issues/105
for version in "${versions[@]}"; do
  if [[ "${version}" != "${venv}" ]]; then
    if pyenv-virtualenv-prefix "${version}" 1>/dev/null 2>&1; then
      if [ -z "${QUIET}" ]; then
        echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2
      fi
      echo "false"
      exit 1
    fi
  fi
done

shell="${PYENV_SHELL:-${SHELL##*/}}"
prefix="$(pyenv-prefix "${venv}")"

if [ -L "${prefix}" ]; then
  prefix="$(resolve_link "${prefix}" 2>/dev/null)"
fi

# exit as success if the virtualenv is already activated
if [[ "${VIRTUAL_ENV}" == "${prefix}" ]]; then
  if [ -z "${FORCE}" ]; then
    if [ -z "${QUIET}" ]; then
      echo "pyenv-virtualenv: version \`${venv}' is already activated" 1>&2
    fi
    echo "true"
    exit 0
  fi
fi

pyenv-sh-deactivate --force --quiet || true

if [ -n "$PYENV_VIRTUALENV_VERBOSE_ACTIVATE" ]; then
  echo "pyenv-virtualenv: activate ${venv}" 1>&2
fi

if [ -z "$no_shell" ]; then
  # shell version set in pyenv-sh-activate should be unset
  # https://github.com/yyuu/pyenv-virtualenv/issues/61
  OLDIFS="$IFS"
  IFS=:
  case "$shell" in
  fish )
    cat <<EOS
set -gx PYENV_VERSION "${versions[*]}";
set -gx PYENV_ACTIVATE_SHELL 1;
EOS
    ;;
  * )
    cat <<EOS
export PYENV_VERSION="${versions[*]}";
export PYENV_ACTIVATE_SHELL=1;
EOS
    ;;
  esac
  IFS="$OLDIFS"
fi

# virtualenv/venv
case "${shell}" in
fish )
  cat <<EOS
set -gx PYENV_VIRTUAL_ENV "${prefix}";
set -gx VIRTUAL_ENV "${prefix}";
EOS
  ;;
* )
  cat <<EOS
export PYENV_VIRTUAL_ENV="${prefix}";
export VIRTUAL_ENV="${prefix}";
EOS
  ;;
esac

# anaconda/miniconda
if [ -x "${prefix}/bin/conda" ]; then
  if [[ "${prefix}" != "${prefix%/envs/*}" ]]; then
    CONDA_DEFAULT_ENV="${venv##*/envs/}"
  else
    CONDA_DEFAULT_ENV="root"
  fi
  case "${shell}" in
  fish )
    echo "set -gx CONDA_DEFAULT_ENV \"${CONDA_DEFAULT_ENV}\";"
    ;;
  * )
    echo "export CONDA_DEFAULT_ENV=\"${CONDA_DEFAULT_ENV}\";"
    ;;
  esac
fi

if [ -n "${PYTHONHOME}" ]; then
  case "${shell}" in
  fish )
    cat <<EOS
set -gx _OLD_VIRTUAL_PYTHONHOME "${PYTHONHOME}";
set -e PYTHONHOME;
EOS
    ;;
  * )
    cat <<EOS
export _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME}";
unset PYTHONHOME;
EOS
    ;;
  esac
fi

PYENV_VIRTUALENV_DISABLE_PROMPT="${PYENV_VIRTUALENV_DISABLE_PROMPT:-${PYENV_VIRTUAL_ENV_DISABLE_PROMPT}}"
PYENV_VIRTUALENV_DISABLE_PROMPT="${PYENV_VIRTUALENV_DISABLE_PROMPT:-${VIRTUAL_ENV_DISABLE_PROMPT}}"

if [ -z "${PYENV_VIRTUALENV_DISABLE_PROMPT}" ]; then
  case "${shell}" in
  fish )
    if [ -z "${QUIET}" ]; then
      echo "pyenv-virtualenv: prompt changing not working for fish." 1>&2
    fi
    ;;
  * )
    if [ -z "${QUIET}" ]; then
      echo "pyenv-virtualenv: prompt changing will be removed from future release. configure \`export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior." 1>&2
    fi
    cat <<EOS
export _OLD_VIRTUAL_PS1="\${PS1}";
export PS1="(${venv}) \${PS1}";
EOS
    ;;
  esac
fi

# conda package anaconda/miniconda scripts (#173)
if [ -x "${prefix}/bin/conda" ]; then
  shopt -s nullglob
  case "${shell}" in
  fish )
    # conda 4.4 and above
    for script in "${prefix}/etc/fish/conf.d"/*.fish; do
      echo "source \"${script}\";"
    done
    ;;
  * )
    CONDA_PREFIX="$prefix"
    echo "export CONDA_PREFIX=\"${CONDA_PREFIX}\";"
    for script in "${prefix}/etc/conda/activate.d"/*.sh; do
      echo ". \"${script}\";"
    done
    # conda 4.4 and above
    for script in "${prefix}/etc/profile.d"/*.sh; do
      echo ". \"${script}\";"
    done
    ;;
  esac
  shopt -u nullglob
fi

環境

  • pyenv 1.2.5
  • pyenv-virtualenv 1.1.3 (python -m venv)
  • mac OS X High Sierra

参考

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

Twitter

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?