Python備忘録(1) 環境構築

Pythonの環境構築、バージョン管理、パッケージ管理と、IDEの基本的な使用方法をまとめておく。情報は2021年5月頭時点。使用環境は下記の通り。

```
Windows 10 HOME (64 bit)
Intel(R) Core(TM) i5-10300H CPU @ 2.50GHz   2.50 GHz
RAM: 8.00 GB
```

# WindowsにPythonのexeを入れる
下のサイトを参照。

https://www.python.jp/install/windows/install.html

手順：
1. Pythonをダウンロード
2. インストール
3. PowerShellでポリシーを設定

以上。

#### 手順の詳細
手順の1番「**Pythonをダウンロード**」について、上記の参考サイトからリンクされている非公式Pythonダウンロードリンク（https://pythonlinks.python.jp/ja/index.html ）から欲しいバージョンのPythonをダウンロードする。複数のバージョンを入れても問題ない。

手順の2番「**インストール**」について、「Add Python 3.9 to PATH」にチェックを入れてインストールする。

手順の3番「**PowerShellでポリシーを設定**」について、PowerShellはデフォルトでスクリプトを実行しない設定（Restricted）になっているので、これを「信頼された発行元からのファイル」なら実行する設定（RemoteSigned）に変更する。ただし変更の対象範囲（スコープ）を現在のユーザーに限定する。すなわち下のコマンドを実行する。

```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```

詳細は下のサイトを参照

https://qiita.com/kikuchi/items/59f219eae2a172880ba6

#### 使用方法
環境を入れるとPowerShellでpyコマンドが使用できるようになる。pyコマンドはバージョンを指定してpythonコマンドを実行する。

```powershell
py -3.9 -m pip install --upgrade pip
py -3.9 -m pip install flake8
py -3.9 -m pip install mypy
py -3.9 -m pip install ipython
py -3.9 -m pip install sphinx
py -3.9 -m pip check
py -3.9 myfile.py 
py -3.9 -m flake8 myfile.py
py -3.9 -m mypy --strict myfile.py
py -3.9 -m IPython
sphinx-quickstart
```

#### 備考
Sphinxはvenvを作って入れる方が良いかもしれない。下のサイトでもvenvを使用している。

https://sphinx-users.jp/gettingstarted/install_windows.html

Chocolateyを用いる場合はaptの感覚で管理することができるようだ。下記参照。

https://qiita.com/konta220/items/95b40b4647a737cb51aa

https://qiita.com/ns_k/items/bedaa80f4a5129e4eef4

# WindowsにAnacondaで入れる
Anacondaは2020年に一部有償化された。

https://qiita.com/c60evaporator/items/ba41cef4b37465c39948

ここではIndividual Editionを想定する。

手順：
1. Anacondaのサイトからexeファイルをダウンロード
2. Anaconda Navigatorを起動
3. Environmentsタブで仮想環境一覧を開く
4. 仮想環境を作成
5. 仮想環境のパッケージ管理
6. condaのアップデート
7. 仮想環境にパッケージをインストール

以上。

#### 手順の詳細
手順の1番「**Anacondaのサイトからexeファイルをダウンロード**」について、2021-05-02時点では、Anacondaのサイト（https://www.anaconda.com/ ）のトップにタブがあり、「Products」タブから「Individual Edition」を選択すると、少しスクロールした位置に「Download」ボタンがある。それをクリックするとページ下までスクロールしてOS選択ができる。

手順の2番「**Anaconda Navigatorを起動**」について、正常にインストールされていればスタートメニュー内にAnaconda3グループが出来ているはずなのでそこからAnaconda Navigatorを起動する。起動直後は鬱陶しいコンソールウィンドウが何度か出現/消滅するが、しばらく待つとWindowが表示される。

手順の3番「**Environmentsタブで仮想環境一覧を開く**」について、左側の「Environments」タブを選択する。中央列に最初は「base (root)」だけがあるが、ここに順に仮想環境を追加していく。

手順の4番「**仮想環境を作成**」について、下の方にある「Create」ボタンを押す。Pythonのバージョンと仮想環境名を指定して環境を作成する。無事に作成されると、中央列に作成した仮想環境の項目が表示される。

あるいはcondaコマンドで作成しても良い。

```
conda create --name myenv python=3.8
```

手順の5番「**仮想環境のパッケージ管理**」について、仮想環境の項目の右側にある三角ボタンをクリックするとメニューが出現するので、そこで「Open Terminal」を選択する。コマンドプロンプトが現れる。コマンドプロンプトのプロンプトは(base)のように選択中の仮想環境名が表示された状態になっている。

あるいは

```
conda activate myenv
```
のようにcondaで仮想環境を切り替える。

手順の6番「**condaのアップデート**」について、conda自体をアップデートしておく。

```
conda update -n base -c defaults conda
```

手順の7番「**仮想環境にパッケージをインストール**」について、必要なパッケージをpipコマンドの代わりにcondaコマンドを使用してインストールする。

```
conda install numpy
```
パッケージのインストールが完了したらコマンドプロンプトは閉じてよい。Anaconda Navigatorの表示を更新するにはAnaconda Navigator上で環境をもう一度クリックするか、「Update Index」ボタンをクリックする。

Anaconda Navigatorパッケージの一覧には、PythonアイコンのパッケージとAnacondaアイコンのパッケージの二種類ができることがある。Anacondaもパッケージリストを持っているらしく、リストに登録されていないパッケージの場合はpipで入れる必要がある。pipで入れたパッケージはPythonアイコンになる。

#### 使用方法
Anacondaでは開発にSpyderというIDEを使用することができる。仮想環境が起動している状態で```spyder```コマンドを打つとSpyderエディタが開く。ひとたびSpyderの起動を行うと、Windowsのスタートメニューにその仮想環境用のSpyderへのリンクができるので、そこから起動ができるようになる。
Spyderのペイン構成はデフォルトでは左側がコード領域、右上がグラフなどのプロット領域、右下がipythonとなっている。コード領域に対して実行を行うと、右下のipython領域にrunfile()コマンドが打たれるという仕組みになっている。コマンドライン引数は下の例のように文字列で与える。

```python
runfile('mycode.py', wdir='C:/path/to/work_dir', args='input1.txt input2.txt')
```

# PyCharm
有償版（Professional）と無償版（Community）がある。
詳細は下記のサイトを参照

https://qiita.com/PoodleMaster/items/563a53639d499f3a7adc

ここでは無償版（Community版）を想定する。

手順：
1. インストール
2. プロジェクトを作成
3. パッケージをインストール

以上。

#### 手順の詳細
手順1「**インストール**」について、インストール手順は特に悩むところはない。

手順2「**プロジェクトを作成**」について、インストールしたPyCharmを起動して「New Project」で新規プロジェクトを作成する。この時点でPythonインタープリタの選択ができるので、Anacondaなどで仮想環境を作成している場合は適宜使用したいものを選択する。

手順3「**パッケージをインストール**」について、「File」→「Settings」を選択し、左側メニューで「Project: {プロジェクト名}」の中の「Python Interpreter」を選択すると、右側にパッケージ一覧が表示される。左上にある+ボタンで必要なパッケージをインストールする。

#### 使用方法
コマンドライン引数は、「Run」→「Edit Configurations」を選択し、対象ファイルを選択してから「Configuration」タブの「Parameters」欄に記入する。

「Code」→「Inspect Code」でコードをチェックする。左下のProblemsにも警告が表示される。

# Visual Studio Code
使用経験なし。

下記のサイトに説明がある模様。

https://qiita.com/TaroNakasendo/items/967029de4e86b95882ef

# Jupyter Notebook
Jupyter Notebookは、クライアント側に入力したコードをサーバー側で実行するという形のウェブアプリケーションと思われる。ここではWindowsにPythonのexeが入っている状態からの環境構築を想定する。

手順：
1. pipでnotebookをインストール
2. jupyter-notebookを起動

以上。

#### 手順の詳細
手順1「**pipでnotebookをインストール**」について、PowerShell上のpipでnotebookパッケージを入れる。

```powershell
py -3.9 -m pip install notebook
```
これを実行するとPowerShell上で```jupyter-notebook```コマンドが使用できるようになる。

手順2「**jupyter-notebookを起動**」について、PowerShell上で以下のコマンドを打って起動する。

```powershell
py -3.9 -m notebook
```
正常に起動するとブラウザが立ち上がりJupyterの画面が開く。
Pythonのバージョンを気にしない場合は```jupyter-notebook```コマンドで起動しても良い。

#### 備考
今回初めて試したが、ざっと見た印象ではDjangoやFlaskのようなウェブアプリケーションと同じようなものと思われる。Anacondaをインストールした場合はAnacondaから起動することが出来るらしい。
VirtualBox上のUbuntuでもおそらく同じ手順で可能だが、ホスト側の画面に映すためにはネットワークの設定が必要になると思われる。Docker内のUbuntuでも同様。

# Cygwin
Cygwinに入れる。この方法は今回の動作環境では未検証。

Cygwinはsetup.exeというパッケージ管理ソフトでパッケージを一元管理しているので、そこのPythonメニューからPython関連のものを選択すればよい。いったんPython環境を入れればpipで追加していくこともできる。ただしCygwinのsetup.exeとpipの相性が良いかどうかは未調査。

# WindowsのVirtualBoxにUbuntuを入れその中にPython環境を作る
手順：
1. VirtualBoxのインストール
2. UbuntuのISOイメージをダウンロード
3. Ubuntu環境を作成
4. Ubuntu上にPython環境を構築

以上。

#### 手順の詳細
手順の1番「**VirtualBoxのインストール**」については特に悩むところはない。

手順の2番「**UbuntuのISOイメージをダウンロード**」について、Ubuntuには16.04LTSや18.04LTSや20.04LTSのような長期保証バージョンがあるので、使用したいバージョンのものを入手する。

手順の3番「**Ubuntu環境を作成**」について、途中の細かい設定項目の最適値は人・環境に依存するので適宜試行錯誤する。入手したISOイメージを仮想光学ディスクファイルに指定する[^1354]。Guest Additionsを忘れずインストールする[^1355]。Guest Addtionsインストール後に共有フォルダを設定する[^1439]。

手順の4番「**Ubuntu上にPython環境を構築**」は次の項目を参照。

[^1354]: 普通のPCにはUSBポートやCD挿入口があるが、仮想マシンの場合はこのようにホスト側からソフト的に入れるということなのだと理解している。
[^1355]: これをインストールしておかないと色々と不便である。
[^1439]: このあたりは若干挙動が不安定な場合がある。

# Ubuntuでのやり方
Ubuntuでは普通Pythonが最初から入っている。Ubuntuのバージョンやaptに絡んでくるので、バージョン管理を慎重に行う必要がある（最初から入っているPythonにシステムが依存している可能性があるため、破壊しないように注意する）。
ここではUbuntu 18.04LTSを想定する。Ubuntu 18.04LTSの場合デフォルトでPython 3.6が入っていた。

手順：
1. システムが最新であることを確認
2. Pythonのバージョンを確認

以上。

#### 手順の詳細
手順の1番「**システムが最新であることを確認**」について、以下のコマンドで最新にする。

```
sudo apt update
sudo apt -y upgrade
```

手順の2番「**Pythonのバージョンを確認**」について、

```
python --version
```
Python 2とPython 3が共存している場合、```python```コマンドではPython 2が呼ばれる場合がある。そういう場合、```python3```コマンドが別途用意されていることがある。```type python```または```which python```でパスを確認し、シンボリックリンクの状態を確認する。

パッケージ管理は前述のとおり慎重に行う必要がある。次項のvenvなどの仮想環境を作るのが良いだろう。
欲しいバージョンのPythonがシステムにない場合、自分でインストールする（これは今回は試していない）。

# venv
パッケージの環境を複数用意したい場合は、これを使用する。

手順：
1. 仮想環境用のディレクトリを用意
2. 仮想環境を作成
3. 仮想環境の起動/終了

以上。

#### 手順の詳細
手順の1番「**仮想環境用のディレクトリを用意**」について、venvは一つ一つの仮想環境をそれぞれ一つのディレクトリに割り当てるのだが、通常は仮想環境を複数作るので、それらを格納する親ディレクトリを用意しておくのがわかりやすい。

```
mkdir ~/venvs/
cd ~/venvs/
```
共有フォルダなどを指定するとうまくいかない場合がある。ホームディレクトリ直下に作るのがわかりやすい。

手順の2番「**仮想環境を作成**」について、例えばmyenvという名前の仮想環境を作る場合、以下のコマンドを使用する。

```
venv myenv
```
myenvディレクトリが作成される。このディレクトリの中にパッケージがインストールされる。
仮想環境を削除するには単純にフォルダを削除すれば良い。

手順の3番「**仮想環境の起動/終了**」について、作成された仮想環境のディレクトリの中のbin/activateというファイルを読み込ませると仮想環境が起動した状態になる。Bashの場合、

```bash
source myenv/bin/activate
deactivate
```
仮想環境を起動するとプロンプトに(myenv)のように環境名が表示された状態になる。この状態でpipで入れればパッケージは仮想環境内にインストールされる。いったんインストールすれば再起動（deactivate後にactivate）しても使用することができる。

# Docker
pythonイメージを使用する。

手順：
1. Docker作成用のファイルを準備
2. docker compose
3. うまく作れたか確認
4. docker execで接続

以上。

#### 手順の詳細
手順の1番「**Docker作成用のファイルを準備**」について、
下記のフォルダ構成とする。

```
└── python
    ├── Dockerfile
    └── docker-compose.yml
```

Dockerfileとdocker-compose.ymlには例えば下のファイルを用意する。

```dockerfile
FROM python:3
USER root

RUN apt update
RUN apt -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

RUN pip install --upgrade pip && \
    apt install vim -y && \
    apt install graphviz -y && \
    apt install cmake -y && \
    apt install mypy -y && \
    pip install ipython && \
    pip install --upgrade ipython && \
    pip install flake8
```

```docker-compose.yml
version: "3"
services:
  python:
    build: .
    container_name: "python"
    working_dir: "/root/"
    tty: true
    volumes:
      - /home/share:/root/work
```
volumeは、ホスト側の共有したいパスの後ろに共有フォルダ名を指定する。

手順の2番「**docker-compose**」について、上記のファイル群を置いたPythonディレクトリで以下のコマンドを叩く。

```bash
docker-compose up -d --build
```

手順の3番「**うまく作れたか確認**」について、例えば以下のコマンドで確認する。

```bash
docker ps -a
```
コンテナID、イメージ名、ステータスなどが表示される。
他に```docker container ls```や```docker image ls```というコマンドもある。
イメージ名はフォルダ名などから自動で決定される。対応するコンテナIDが「a1b2c3d4e5f6」となっていると想定する。

手順の4番「**docker execで接続**」について、以下のコマンドで接続する。

```bash
docker exec -it a1b2c3d4e5f6 bash
```
オプションの ```-it```は対話的に実行、 ```bash```の部分はシェルを指定。
docker attachだとすでに起動しているDockerの本流のシェルに接続するが、docker execの場合はもう少し弱く接続する（ので、うっかり本流を殺してしまう心配がない）。

#### 使用方法
いったんDockerを起動してしまえばあとは通常のUbuntuの感覚と変わらない。

#### 備考
データをホスト側とやり取りする場合、共有フォルダを使用するのが楽。ただし、普段の入出力を共有フォルダにするとパフォーマンス（処理速度）が落ちることに注意。

# WSL2とDocker Desktop
Windows 10のWSL2にはLinuxカーネルが使用されているらしく、機能を有効化することでWindowsのちょっとしたアプリケーションの感覚でDockerが使用できる。
このDockerを管理するGUIアプリケーションがいくつか存在する。

https://appfleet.com/blog/top-gui-for-docker/

ここではDocker Desktopを想定する。
手順：
1. Docker Desktopをインストール
2. 警告が出た場合、メッセージに従って対処

以上。

#### 備考
GUIやGPUが使用できるかどうかは未検証。これらは例えば以下のサイトを参照。

https://news.mynavi.jp/article/20200531-windows10report/

https://qiita.com/ksasaki/items/ee864abd74f95fea1efa

# pipのバージョン管理
pipの実行方法はいくつか存在する。

```
pip
pip3
python -m pip
python3 -m pip
```
環境やバージョンに合わせた実行方法にする必要がある。ここでは表記を```pip```で揃えて記述する。パッケージの管理には以下のコマンド群を使用する。

| コマンド（Bashを想定） | 処理 |
|:-|:-|
| pip list | パッケージ一覧を表示 |
| pip check | パッケージ整合性のチェック |
| pip install numpy | numpyパッケージをインストール |
| pip install numpy==1.20.2 | numpyパッケージ（バージョン1.20.2）をインストール |
| pip uninstall numpy | numpyパッケージをアンインストール |
| pip install -r requirements.txt | requirements.txt記述のパッケージをまとめてインストール |
| pip freeze > requirementst.txt | パッケージ一覧をrequirements.txtに保存 |

#### 備考
Python単体で閉じているパッケージはこれでおおむね問題ないが、Python外のソフトと連携しているとややこしい場合がある[^1413]。
[^1413]: 例えばaptと絡んでくる場合や、自分で用意したインストールフォルダが絡んでくる場合がある。