2020年のPythonプロジェクトのはじめかた(windows wslとmac共通化編)

#Windows 10に、Macと同様の手順で、モダンでlinuxなpython環境を導入する。

２年前、Mac向けの良記事[『2018年のPythonプロジェクトのはじめかた』](https://qiita.com/sl2/items/1e503952b9506a0539ea)を参考に、windows 10上のWSL（Windows Subsystem for Linux）で（当時）モダンなlinuxなpython環境を用意した（[記事:10行くらいコマンドを叩いてモダンなPython環境を用意](https://qiita.com/e-a-st/items/72c2e2a6a566d1f5d2a2)）。未だに当時の環境をアップデートして使っているのだけれど、scala/java系の業務ではMacを使ってきたこともあり、Macのやり方とより親和的なpython環境構築に採用してみることにした。
結論としては、メンテナンス性を考えるとこのアプローチは断然あり、と思った。言語を問わず汎用的なアプローチなので、pythonもjavascriptも近い将来に使わねばといった初心者の方も、時間があるときにでもチャレンジしていただきたい。

※　今回参考にした記事: [2020 年の Python パッケージ管理ベストプラクティス](https://qiita.com/sk217/items/43c994640f4843a18dbe)

# 本年の方針
- WSL版ubuntuを使い、homebrewを導入する
- homebrewからanyenvを導入する。
- anyenvからpyenvを入れ、パッケージ管理はpipenvからpoetryへと変更する。

anyenvを使うとひと手間増えてはいるんだけれど、nodejs等も同じようにバージョン管理したかったので挑戦。より多様な環境を構築する選択肢としては、[asdf](https://github.com/asdf-vm/asdf)があるらしいのだけれど、そちらは、もう少し枯れた２年後くらいに採用かな。

### (おまけ) ついでにvscode環境もwin/mac共通にしておく。
個人的に２年前と大きく変わったのが、vscodeを使う比率が増えたこと。...それ以前は数十億行のテキストファイルを扱う必要などあって、sublimetextを使っていた。今となっては、Macもwindowsもエディタは、vscodeでいいじゃんとなっている。ということで、以下記事も書いた。vscode+pythonな人はこちらもチラ見してみてください。
[Macと近しい環境をWindows10で安直に実現する(wsl+vscode+homebrew)](https://qiita.com/e-a-st/items/a212318497c93966a651)

# WSL版ubuntuでの手順
Macとwindows wsl(ubuntu)とで、コマンドの違いは数行のみ。最近、個人PCのwindow10マシンが調子が悪くお亡くなりになりそうなので、個人PCはmac onlyとする際に、Macでの差分も書こうかと。

##①　homebrewを導入
WSL版ubuntuには、homebrewは楽々導入できる。以下、初期状態のubuntuへの導入手順

```.sh
sudo apt update
sudo apt upgrade
sudo apt install linuxbrew-wrapper build-essential
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc
source ~/.bashrc
```

※　.bashrcが汚れる～、な方は、別途一工夫してくださいまし。

## ②　anyenvを導入
ここから先は、Macとほぼ同手順。ありがたや。
anyenvとanyenvの便利プラグインを入れる。
pyenvのためには必要ないプラグインもあるが、他言語を使う日に備えて入れておこう。

```
brew install anyenv
anyenv init
echo 'eval "$(anyenv init -)"' >> ~/.bashrc
exec $SHELL -l
anyenv install --init
anyenv -v
mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
anyenv update

```

## ③　pyenv/python/poetryを導入
ここは、若干wsl版ubuntu固有の手順もある。が、以下のコマンドをひたすらポチポチするのみ。
ubuntuのバージョン等が変わると、手順が変わることもありうる。その際は、`pyenv/ubuntu/poetry`のいずれかのキーワードでググって頑張ろう。２年前の記事では半年に１回くらい微妙に手順が変わって記事をアップデートしたので、今回も同様の頻度でチェックして適宜本記事をアップデートしようと思う（たいして書くことない気はするが）。

```.sh
anyenv install pyenv
exec $SHELL -l
sudo apt-get install -y libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
pyenv install 3.8.2
pyenv global 3.8.2
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
source $HOME/.poetry/env
```


#終わりに

### インストール後
こんな感じになっているはず。

```
userid@DESKTOP-YourID:~$ poetry
Poetry version 1.0.5

USAGE
  poetry [-h] [-q] [-v [<...>]] [-V] [--ansi] [--no-ansi] [-n] <command> [<arg1>] ... [<argN>]

ARGUMENTS
  <command>              The command to execute
  <arg>                  The arguments of the command

GLOBAL OPTIONS
  -h (--help)            Display this help message
  -q (--quiet)           Do not output any message
  -v (--verbose)         Increase the verbosity of messages: "-v" for normal output, "-vv" for more verbose output and "-vvv" for debug
  -V (--version)         Display this application version
  --ansi                 Force ANSI output
  --no-ansi              Disable ANSI output
  -n (--no-interaction)  Do not ask any interactive question

AVAILABLE COMMANDS
  about                  Shows information about Poetry.
  add                    Adds a new dependency to pyproject.toml.
  build                  Builds a package, as a tarball and a wheel by default.
  cache                  Interact with Poetry's cache
  check                  Checks the validity of the pyproject.toml file.
  config                 Manages configuration settings.
  debug                  Debug various elements of Poetry.
  env                    Interact with Poetry's project environments.
  export                 Exports the lock file to alternative formats.
  help                   Display the manual of a command
  init                   Creates a basic pyproject.toml file in the current directory.
  install                Installs the project dependencies.
  lock                   Locks the project dependencies.
  new                    Creates a new Python project at <path>.
  publish                Publishes a package to a remote repository.
  remove                 Removes a package from the project dependencies.
  run                    Runs a command in the appropriate environment.
  search                 Searches for packages on remote repositories.
  self                   Interact with Poetry directly.
  shell                  Spawns a shell within the virtual environment.
  show                   Shows information about packages.
  update                 Update the dependencies as according to the pyproject.toml file.
  version                Shows the version of the project or bumps it when a valid bump rule is provided.

userid@DESKTOP-YourID:~$ python
Python 3.8.2 (default, Apr  4 2020, 23:48:47)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

私のPCにはpythonの他にnodejsも入れたのだが、brew上は、きれいなもの(hugoはブログ作成目的で別途導入)。この点が、今回のやり方の良い点と思う。

```
$ brew list
anyenv  hugo  patchelf
```

### パッケージ管理ツールpoetryのお勉強方法
公式文書の日本語訳をなされている(以下)ので、ここから始めるのがよさそうだ。
https://cocoatomo.github.io/poetry-ja/basic-usage/

### winpython（portable版をおすすめ）も適宜併用しよう。
ここに書いたような手順でpyhonとパッケージのバージョン管理することが大事になるのは、納期が厳しいweb開発でpythonを使う場合など、１つでも動かないパッケージがある場合かと。
データエンジニア/データサイエンス系の案件の場合は、どちらかというと指定された（しばしばレガシーな）データベースとの接続が必要となる。古めのデータベースとの接続の場合、linux版のドライバには無理目なこともある。pyenvをwsl上で完結させている場合、winpythonとの併存は当然ながら何の問題もない。ODBC経由等でのデータベース接続という選択肢を確保する意味でwinpythonも適宜併用しよう。portable版なら環境が汚れる心配がないから、python単体では、アナコンダやpandas/numpyも勝手に導入されるwinpythonが最強かもしれない。ただ、シェルを介して、他のツールと連携とかなると、やっぱwslなpyenvが欲しくなるんだけどね。

# [おまけ]　nodejsのバージョン管理も同様に。

本手順を踏めば、nodejsのバージョン管理も楽々だ。現時点の最新版のnodejsを導入する場合は、以下の通り。

```
anyenv install nodenv
exec $SHELL -l
touch $(nodenv root)/default-packages
nodenv install 13.2.0
nodenv global 13.12.0
```
`node -v`でバージョンを確認できる。