Python仮想環境の構築

# はじめに

Pythonで開発を進める場合、SystemにインストールされているOS標準のPythonや、OSのパッケージ管理ツール経由で入れたPythonバージョンは使わないでおきましょう。理由として、開発が、それらのPythonやそのモジュールに依存してしまい、依存関係を気にせず自由に開発できなるからです。

# Pythonのインストール先`/opt`

[Filesystem Hierarchy Standard(FHS)](https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)に従うと、`/usr/local`は、システム管理をする時にローカルで利用するソフトウェアをインストールする領域になります。 `/opt`は、 付属(add-on)で必要なソフトウエアをインストールする領域です。つまり、FHSに従うと、`/opt`が適当ということになります。

# ubuntuで直接インストール

## 環境準備

```bash:apt-get
# apt-get で必要なパッケージをインストールする
$ sudo apt-get install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev \
    libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
    xz-utils tk-dev libffi-dev liblzma-dev python-openssl
```

## インストール

```bash:python.org
# ソースのダウンロード先に移動
$ cd $HOME/src

# openssl-1.1.1 以上をインストールしておく
$  wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1t.tar.gz
$ tar zxvf openssl-1.1.1t.tar.gz && openssl-1.1.1t
$ ./config --prefix=/opt/openssl
$ make
$ make test
$ sudo make install
$ sudo ln -s /opt/openssl/lib/libssl.so.1.1 /usr/lib/
$ sudo ln -s /opt/openssl/lib/libcrypto.so.1.1 /usr/lib/
$ sudo ldconfig

# wget を使って、ソースファイルをダウンロード
$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz

# tar を使って、ソースファイルを解凍して、ソースのあるディレクトリに移動
$ tar zxvf Python-3.10.11.tgz && cd Python-3.10.11

# インストール先を指定して、コンパイル環境の設定を行う
$ 
$ ./configure --prefix=/opt/python/versions/3.10.11  --with-openssl=/opt/openssl

# Pythonをソースからビルドする
$ make

# コンパイルされたバイナリファイルを指定したディレクトリにインストール
$ sudo -H make install
```

# MAC OSで直接インストール

## 環境の準備

```bash:MacOS
# brew環境を準備する
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# brewが既に入っている場合、pyenvを削除しておく
$ brew uninstall pyenv

# readlineをインストール
$ brew install readline xz openssl@1.1

# ファイルをダウンロードするための wget をインストールする
$ brew install wget

# Macのビルド環境を xcode-select を使ってインストール（xcodeをインストールしている必要がある）
$ sudo xcode-select --install

# ヘッダーを準備
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

## インストール

```bash:python.org
# ソースのダウンロード先に移動
$ cd $HOME/src

# wget を使って、ソースファイルをダウンロード
$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz

# tar を使って、ソースファイルを解凍して、ソースのあるディレクトリに移動
$ tar zxvf Python-3.10.11.tgz && cd Python-3.10.11

# コンパイル環境変数準備
$ export CFLAGS="-I$(brew --prefix openssl@1.1)/include -I$(brew --prefix readline)/include"
$ export LDFLAGS="-L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix readline)/lib"
# $ export CC='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc'
# $ export CPP='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -E'

# インストール先を指定して、コンパイル環境の設定を行う
$ ./configure --prefix=/opt/python/versions/3.10.11 --with-openssl="$(brew --prefix openssl@1.1)"

# インストール先とopensslのライブラリの場所を指定して、コンパイル環境の設定を行う
# 環境によって、opensslの場所が環境に設定されていない場合があるので、念の為設定する
$ make

# コンパイルされたバイナリファイルを指定したディレクトリにインストール
$ sudo -H make install
```

# pyenvでインストールする場合

まず、UbuntuまたはMacの環境準備を済ませておく

```bash:pyenv
# インストール先を設定する
$ cd /opt

# ディレクトリpythonを作って、そこにpyenvの環境を保存する
$ sudo git clone git://github.com/yyuu/pyenv.git ./python

# 必要なディレクトリを作成する
$ sudo mkdir python/versions python/shims


# ---------------------------- #
# グループを指定して環境を準備
# ---------------------------- #

## MacOSの場合
### staffのグループ権限を作成したディレクトリに設定
### ディレクトリのグループ権限を変更
$ sudo chown root:staff python/versions/ python/shims/

# or

## Ubuntuの場合
### グループ作成
$ sudo groupadd pyenv
### グループに自身を追加
$ sudo usermod -aG pyenv ${USER} 
### ディレクトリのグループ権限を変更
$ sudo chown root:pyenv python/versions/ python/shims/

# ---------------------------- #


# 作成したディレクトリにグループのwrite権限を付与
$ sudo chmod 2775 python/versions/ python/shims/

# pyenvでインストールするpythonのインストール先を指定する
$ export PYENV_ROOT=/opt/python

# pyenvの環境を初期化
$ eval "$(/opt/python/bin/pyenv init -)"

# pyenvでpythonをインストール
$ /opt/python/bin/pyenv install -v 3.10.11
```

# 仮想環境設定

```shell-session:python
$ /opt/python/versions/3.10.11/bin/python3 -m venv venv
$ source venv/bin/activate
(venv) $ python -V
Python 3.10.11

$ sudo /opt/python/versions/2.7.16/bin/python -m ensurepip
$ sudo /opt/python/versions/2.7.16/bin/pip install -U pip
$ sudo /opt/python/versions/2.7.16/bin/pip install virtualenv
$ /opt/python/versions/2.7.16/bin/virtualenv venv27
$ source venv27/bin/activate
(venv27) $ python -V
Python 2.7.16
```