Python3のvenvで仮想環境を作成するところまで

# Python3のvenvについて
## 参考
[仮想環境とパッケージ](https://docs.python.org/3/tutorial/venv.html)
### 環境
- OS
    - Windows10
        - WSL2: Ubuntu18.04
- 言語
    - anyenv
        - pyenv
            - python 3.8.5

## 導入
[Introduction](https://docs.python.org/3/tutorial/venv.html#introduction)

- Pythonで自己完結型のディレクトリツリーを作成すること。
- ディレクトリごとにモジュールを独立させること。

## 仮想環境の作成
- venvは通常、入手可能な最新バージョンのPythonをインストールします。
- （pyenvなどを使用することによって）システムに複数のバージョンのPythonがある場合は、任意のバージョンを実行して特定のPythonバージョンを選択できる。
- 仮想環境を作成するには、それを配置するディレクトリを決定し、ディレクトリパスを使用してスクリプトとしてvenvモジュールを実行する

```bash:仮想環境の作成
root@MY-PC:~/workspace/python# python3 -m venv <任意の名前>
```
```bash:ディレクトリを作成してから仮想環境を作成する場合
root@MY-PC:~/workspace/python# mkdir <任意の名前>
root@MY-PC:~/workspace/python# cd <任意の名前>
root@MY-PC:~/workspace/python/<任意の名前># python -m venv .
```

今回は`tutorial-env`という仮想環境を作成する

```bash:実行後
root@MY-PC:~/workspace/python# ls
tutorial-env
```
- `tutorial-env`というディレクトリが存在しない場合は作成される
- `tutorial-env`の中に以下のものが作成される
    - Pythonインタープリタのコピー
    - 標準ライブラリ
    - その他さまざまなサポートファイルを含むディレクトリ

```bash:ディレクトリ内部
root@MY-PC:~/workspace/python/tutorial-env# ls
bin  include  lib  lib64  pyvenv.cfg
```
仮想環境を作成したら、以下のコマンドでアクティベートできるようになる。

```bash:アクティベート
root@MY-PC:~/workspace/python/tutorial-env# source bin/activate
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# 
```
> このスクリプトはbashシェル用に作成されています。csh,fishシェルを使用する場合は、代わりに使用する`activate.csh`および`activate.fish`スクリプトが用意されています。

仮想環境をアクティベートすると、シェルのプロンプトが変更され、先頭に「(turorial-env)」（実行中の仮想環境名）が追加されます。

```bash:プロンプト
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# 
```
この状態では、仮想環境内のpythonやpipが使用されます。

```bash:pythonとpipの参照
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# which pip
/root/workspace/python/tutorial-env/bin/pip
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# which python
/root/workspace/python/tutorial-env/bin/python
```

### 仮想環境の終了
`deactivate`を実行するとプロンプトが元に戻り仮想環境を終了することができる。

```bash:deactivate
(tutorial-env) root@MY-PC:~/workspace/python# deactivate
root@MY-PC:~/workspace/python# 
```

### pip installでいろいろエラーが出る
`pip install`でエラーが多発していたのでメモ

#### ModuleNotFoundError: No module named '_ctypes'
以下の記事を参考にさせていただき…
[[Qiita]pyenvで3.7系のインストールに失敗したときのメモ](https://qiita.com/hitochan777/items/941d4422c53978b275f8)

```bash:Error
ModuleNotFoundError: No module named '_ctypes'
```
(1) 一旦`python`をアンインストール

```bash:Resolve-1
root@MY-PC:~/workspace/python# pyenv uninstall 3.8.5 
pyenv: remove /root/.anyenv/envs/pyenv/versions/3.8.5? [y|N]y
pyenv: 3.8.5 uninstalled
```
(2) libffi-devというものが必要なようなのでインストール

```bash:Resolve-2
root@MY-PC:~/workspace/python# apt install libffi-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  geoip-database libgeoip1 liblwres160 libmspack0 zerofree
Use 'apt autoremove' to remove them.
The following NEW packages will be installed:
  libffi-dev
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 156 kB of archives.
After this operation, 362 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 libffi-dev amd64 3.2.1-8 [156 kB]
Fetched 156 kB in 1s (132 kB/s)      
Selecting previously unselected package libffi-dev:amd64.
(Reading database ... 36981 files and directories currently installed.)
Preparing to unpack .../libffi-dev_3.2.1-8_amd64.deb ...
Unpacking libffi-dev:amd64 (3.2.1-8) ...
Setting up libffi-dev:amd64 (3.2.1-8) ...
Processing triggers for install-info (6.5.0.dfsg.1-2) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
```
(3) 再び`python3.8.5`をインストール

```bash:Resolve-3
root@MY-PC:~/workspace/python# pyenv install 3.8.5
Downloading Python-3.8.5.tar.xz...
-> https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz
Installing Python-3.8.5...
Installed Python-3.8.5 to /root/.anyenv/envs/pyenv/versions/3.8.5

root@MY-PC:~/workspace/python# 
root@MY-PC:~/workspace/python# python --version
Python 3.8.5
```
#### ModuleNotFoundError: No module named 'Cython'
今度は`Cython`がないと言われたのでそれっぽいことが書かれていた以下の記事を参考にさせていただき

[[Github]ImportError: No module named Cython.Build #78](https://github.com/CellProfiler/centrosome/issues/78)

```bash:Error
ModuleNotFoundError: No module named 'Cython'
```

```bash:Resolve
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# pip install --upgrade cython
Collecting cython
  Using cached Cython-0.29.21-cp38-cp38-manylinux1_x86_64.whl (1.9 MB)
Installing collected packages: cython
Successfully installed cython-0.29.21
```
#### error: `cmake` not found, and `CMAKE` is not set.
今度は`cmake`がないと言われたので

```bash:Error
error: `cmake` not found, and `CMAKE` is not set.
```

```bash:Resolve
(tutorial-env) root@MY-PC:~/workspace/python/tutorial-env# pip install cmake
Collecting cmake
  Downloading cmake-3.18.0-py3-none-manylinux1_x86_64.whl (18.2 MB)
     |████████████████████████████████| 18.2 MB 6.0 MB/s 
Installing collected packages: cmake
Successfully installed cmake-3.18.0
```