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

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

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

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

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

## 仮想環境とは
Python を使って開発や実験を行うときは、用途に応じて専用の実行環境を作成し、切り替えて使用するのが一般的です。こういった、一時的に作成する実行環境を、「仮想環境」 と言います。
仮想環境は、次のような目的で使われます。
- システム全体で使うPython環境に影響を与えずにモジュールの追加・入れ替えをしたい。
- 異なるバージョンの Python を使いわけたり、同じモジュールの、複数のバージョンを使い分けたい。

例えば、開発中のWebアプリケーション開発では、Python 3.7 で Webアプリケーションフレームワークとして Django の 1.10 を使い、新しいプロジェクトでは Python 3.8 とDjango バージョン 1.11 を使用したい場合など、簡単に切り替えられるようにしたい。
引用元:[仮想環境(python japan)](https://www.python.jp/install/windows/venv.html#:~:text=Python%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E9%96%8B%E7%99%BA,%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%80%8D%20%E3%81%A8%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)


##  venvコマンドを使う
pythonを使った開発を行う時は、プロジェクトごとに実行環境を作成し、それらの環境を切り替えて使用するのが一般的です。
```venv``` を使うと```pip```でインストールしたパッケージをプロジェクトごとに独立させることができます。
```pip```コマンドについてはこちらで解説していますので参照してください。

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


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

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

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

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

## venvを使った仮想環境の利用
仮想環境を利用するには主に

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

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

### 新しい環境の作成
まずは新しい仮想環境を作成しましょう。
```
$ mkdir プロジェクトディレクトリ名 
$ cd プロジェクトディレクトリ名
$ python3 -m venv 仮想環境名
```
まずは専用のプロジェクトディレクトリを作成して移動しましょう。

そしたら、プロジェクトディレクトリの直下に python3 -m venv 仮想環境名 として新しく仮想環境を作成しましょう。

ちなみに仮想環境名はvenvとすることが多いです。

仮想環境の作成ができました。

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

起動することで初めて利用できるようになります。
```
$ source 仮想環境名/bin/activate
```
sourceコマンドの後に 仮想環境名/bin/activate とすることで、作成した仮想環境を起動することができます。

コマンドラインには以下のように先頭に仮想環境名が書かれていると思います。その状態の時が仮想環境を起動している状態です。
```
(仮想環境名) $ 
```
pythonのバージョンを確認しましょう。
```
(仮想環境名) $  python -V
Python 3.x.x
```
venvを実行するとコマンドは作成した環境で設定されているバージョンのコマンドが実行されるようになります。

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

## macOSでvenv実践してみる
```
//デスクトップ上に「test_venv」というディレクトリを作成
macOS:Desktop user$ mkdir test_venv

//cdコマンドで「test_venv」ディレクトリへ移動
macOS:Desktop user$ cd test_venv/

//この時点での「python」のパスを確認
macOS:test_venv user$ which python
/Test/test/.pyenv/shims/python

//「test」という仮想環境を作成する。
macOS:test_venv user$ python -m venv test

//lsコマンドで中身を確認すると「test_venv」の中に「test」ディレクトリが作成された。
macOS:test_venv user$ ls
test

//仮想環境を起動する。
macOS:test_venv user$ source test/bin/activate
(test) macOS:test_venv user$ //(test)となり、仮想環境が起動した状態になる。

//この状態で「python」のパスを確認(仮想環境の「test」ディレクトリ内を参照するようにパスが変わっていることが分かる。)
(test) macOS:test_venv user$ which python
/Test/test/Desktop/test_venv/test/bin/python

//仮想環境を終了させる
(test) macOS:test_venv user$ deactivate
//(test)が消えて仮想環境が終了した。
macOS:test_venv user$ 

```

## まとめ
今回は ```venv```について解説しました。
- ```venv```と```virtualenv```には、
venvではできないが、virtualenvでは仮想環境で使うPythonのバージョン指定することが可能であるという違いがある。

- 仮想環境を利用するときは
    **作成、起動、停止** の3つの手順があるのでこれらも覚えておきましょう。

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

## 引用サイト
- Envader(エンベーダー):https://envader.plus/
- コース一覧:https://envader.plus/course
- Python環境構築コース:https://envader.plus/course/8
- 今回解説したコースシナリオ:https://envader.plus/course/8/scenario/1075
- [仮想環境(python japan)](https://www.python.jp/install/windows/venv.html#:~:text=Python%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E9%96%8B%E7%99%BA,%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%80%8D%20%E3%81%A8%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)