EnvaderでPythonの環境構築を学んだのでmacOSで実践してみる(第5回)

## はじめに
はじめましてa-min3150です。エンジニアへの転職を目標に学習中です。
アウトプットのためEnvaderで学習したこと、ハマったことなどを書いていきたいと思います。

## 今回の学習内容
EnvaderでPythonの環境構築について学習したのでアウトプットします。

今回は第5回目でmacでの```virtualenv```を使った仮想環境設定についてです。

第１回(Pythonとは)は[こちら](https://qiita.com/a-min3150/items/bf2e575668cc986dd5d9)
第２回(pyenvについて)は[こちら](https://qiita.com/a-min3150/items/56b2e9bf8957d3247d81)
第３回(pipについて)は[こちら](https://qiita.com/a-min3150/items/6d1c9b7b3b4cd5039f39)
第４回(venvについて)は[こちら](https://qiita.com/a-min3150/items/6211b80617d00284a081)
第６回(requirements.txtの使い方)は[こちら](https://qiita.com/a-min3150/items/c51e5090353e10b4df91)
第７回(git cloneの使い方)は[こちら](https://qiita.com/a-min3150/items/bf8d062a3ab474523e7d)

## ```virtualenv```について
virtualenvは一つのシステム内に複数の開発環境（仮想環境）を作ることができます。
開発するアプリが変わった際に virtualenvを使って仮想環境を作成するだけで、パッケージ、バージョンの変更ををスムーズに行うことができます。

## venvとvirtualenvの違い
```venv```は```virtualenv```がPython3.3から標準機能として取り込まれたもので、他からソフトウェアをインストールする必要がないため、簡単に仮想環境を作成管理することができます。


- venvとvirtualenvの違いは**Python自身の管理ができるか否かです。**

- venvはPython 3.x.x 下に組み込まれた機能なので、Python自体のバージョン管理はできません。

- virtualenvはPython自体のバージョンも管理することができます。

- venvで作成した仮想環境はPythonの別のバージョンに切り替えることはできないので注意しましょう。

## virtualenvのインストール
```
$ sudo pip install virtualenv
```
Pythonにデフォルトで組み込まれているコマンドではないためインストールする必要があります。

## virtualenvを使った仮想環境の利用
[前回](https://qiita.com/a-min3150/items/6211b80617d00284a081)の```venv```と同じで。
仮想環境を利用するには主に

**作成、起動、停止**

の3つの手順が必要になります。

### 新しい環境の作成
まずは新しい仮想環境を作成しましょう。
```
$ mkdir プロジェクトディレクトリ名 
$ cd プロジェクトディレクトリ名
$ python3 -m virtualenv 仮想環境名
      or
$ python3 -m virtualenv -p 利用したいPythonのバージョン(例: python3.6) 環境名
```
まずは専用のプロジェクトディレクトリを作成して移動しましょう。
そしたら、プロジェクトディレクトリの直下に ```python3 -m virtualenv 仮想環境名``` として新しく仮想環境を作成しましょう。オプション -p を使用すればPythonのバージョンを指定することができます。


### 仮想環境の起動
仮想環境を作成しただけでは仮想環境を使用することはできません。

起動することで初めて利用できるようになります。
```
$ source 仮想環境名/bin/activate
sourceコマンドの後に 仮想環境名/bin/activate とすることで、作成した仮想環境を起動することができます。
```
コマンドラインには以下のように先頭に仮想環境名が書かれていると思います。その状態の時が仮想環境を起動している状態です。
```
(仮想環境名) $ 
pythonのバージョンを確認しましょう。

(仮想環境名) $  python -V
Python 3.x.x
```
venvを実行するとコマンドは作成した環境で設定されているバージョンのコマンドが実行されるようになります。

## 仮想環境の停止
仮想環境を停止するときは deactivate コマンドを実行することで仮想環境を終了することができます。
```
(仮想環境名) $ deactivate 
$ 
```
実行した後に仮想環境名がコマンドラインの先頭から消えていれば、仮想環境を停止することができています。

## macOSで```virtualenv```を実践してみる
pipコマンドを使ってvirtualenvをインストールする。
```
macOS:Desktop user$ sudo pip install virtualenv
```
```pip list```でインストールできたか確認
```
macOS:Desktop user$ pip list
Package      Version
------------ -------
pip          22.0.4
setuptools   58.1.0
virtualenv   20.14.1
```
Desktop上に「test_virtualenv」ディレクトリを作成し、そこに移動します。
```
macOS:Desktop user$ mkdir test_virtualenv  && cd $_
```

インストールしているpythonのバージョンリストを確認します。
(globalでは**pythonバージョン3.10.2**に設定されている。)
```
macOS:test_virtualenv user$ pyenv versions
  system
  2.7.10
* 3.10.2 (set by /Users/user/.python-version)
  3.7.0
```
「test_virtual」という仮想環境を作成し、pythonは2.7を指定します。
```
macOS:test_virtualenv user$ python -m virtualenv -p python2.7 test_virtual
```

「test_virtual」という仮想環境が作成された.(指定した仮想環境名と同じ名前のディレクトリが出来上がる。)
```
macOS:test_virtualenv user$ ls//lsコマンドでディレクトリ作成された確認。
test_virtual
```

virtualenvの仮想環境を起動する
```
macOS:test_virtualenv user$ source test_virtual/bin/activate
```
(test_virtual)がつき、仮想環境の起動を確認。
```
(test_virtual) macOS:test_virtualenv user $
```
この状態でpythonのバージョンが指定したものになっているか確認します。
```
(test_virtual) macOS:test_virtualenv user $ python -V
Python 2.7.10
//指定したバージョンになっている!!
```
仮想環境を終了させる。
```
(test_virtual) macOS:test_virtualenv user $ deactivate
macOS:test_virtualenv user $ 
//(test_virtual)の表示がなくなり、終了できた。
```
終了させるとPythonのバージョンは```pyenv```で設定しているものに戻ります。
```
macOS:test_virtualenv user $ python -V
Python 3.10.2
```
## まとめ
今回は```virtualenv```について解説しました。

```virtualenv```と```venv```には明確な違いがあり、
- pythonのバージョンを変える場合があるときは```virtualenv```を使うようにしましょう。

- 仮想環境を利用するときは**作成、起動、停止**3つの手順があります。

次回は[requirements.txtの使い方](https://qiita.com/a-min3150/items/c51e5090353e10b4df91)について解説します。

## 引用サイト
- Envader(エンベーダー):https://envader.plus/
- コース一覧:https://envader.plus/course
- Python環境構築コース:https://envader.plus/course/8
- コースシナリオ:https://envader.plus/course/8/scenario/1074