Pythonの開発環境をプロジェクト単位にWindows環境で用意する(VSCode+virtualEnvWrapper+Pylint)

# はじめに
本記事では1つの開発環境に複数のプロジェクトを共存させる方法について説明します．

開発や保守など複数のプロジェクトを掛け持ちする場合，複数の環境が混在します．
環境を分離しないと，あるプロジェクトの開発環境が，他のプロジェクトで用意したライブラリに暗黙で依存することがあります．
このライブラリへの暗黙の依存により，開発環境で動いたコードが実行環境で動かない問題を防ぐため，プロジェクト単位にライブラリを分離する仮想環境(virtualEnvWrapper)を導入します．

ライブラリを分離したプロジェクト上で実装を効率的に行うため，構文の誤りをリアルタイムに指摘してくれるlinter(Pylint)を導入します．
実装したコードの実行操作をタスクとして登録し，実装〜動作確認を全てVisual Stuide Code(VSCode)上で済ませます．

# 前提
この記事ではWindowsを使った以下の環境を前提とし，以下は全てインストールされているものとします．

- Windows 7
- Python 3.5.1
- VSCode 1.0.0

linterは全ての開発環境で共通に利用するため，システムのPython環境にインストールします．

# 仮想環境の準備

## Python仮想実行環境(virtualenvwrapper)
virtualEnvWrapperは，Pythonで利用するライブラリのインストール環境を，並列に用意できるツールです．
導入した仮想環境のイメージは[Virtualenv and virtualenvwrapper for Python](http://www.futurile.net/2013/10/03/virtualenv-and-virtualenvwrapper-for-python-development/)の"VirtualEnv environments"に載っています．
OS上のPythonに複数の仮想的なプロジェクトを作成して，その中で任意のライブラリをインストールする構成を取ります．

仮想環境を用意する前に，仮想環境を問わずに利用する`Pylint`もインストールします．

```bash:コマンドプロンプト
> pip install virtualenvwrapper-win
> pip install pylint
```

## 仮想実行環境の作成
次に，プロジェクトを用意します．
`<virtualEnvName>`に仮想環境名を与えて，作成します．

作成に成功するとプロンプトに仮想環境の名前が表示されます．

```bash:コマンドプロンプト
>mkvirtualenv <virtualEnvName>
(<virtualEnvName>)>
```

仮想環境は`C:\\Users\<username>\Envs\`に生成され，
`<virtualEnvName>`というフォルダが生成されます．

複数の環境を用意した場合は並列に存在することになります．

# Pylint
## Pythonの設定
VSCodeで`基本設定->ユーザ`設定から，Linterに`pyLint`を指定します．

```bash:
{
...
	//-------- Python configuration --------

...
	// The linter to use
	"python.linter": "pyLint",
...
}
```

## Pylintの設定
プロジェクトを作成したいフォルダでpylintの設定ファイル`.pylintrc`をプロジェクト直下に生成します．

```
>pylint --generate-rcfile > .pylintrc
```

pylintに仮想環境のライブラリが存在するパスを指定します．
`pylint`コマンドのヘルプにも説明があります．

```
--init-hook=<code>  Python code to execute, usually for sys.path
                        manipulation such as pygtk.require().
```

説明の通り，`init-hook`中にPythonのコードを記述します．

```.pylintrc
init-hook="import sys; sys.path.append('module') ; sys.path.append('C:\\Users\<username>\\Envs\\<virtualEnvName>\\Lib\\site-packages')"
```

`<username>`にはWindowsのアカウント名，`<virtulEnvName>`は前述の仮想環境名を入れます．
`sys.path.append('C:\\Users\<username>\\Envs\\<virtualEnvName>\\Lib\\site-packages')`でパスを指定しています．

追加した設定で動作するかは`pylint <filename>.py`で確認できます．
pylintが通ったら，Visual Studio Codeを起動して，構文誤りが指摘されるかを確認します．

# VSCode
## タスクを設定する
開発中のウィンドウ切り替えを極力なくすために
実装や実行を全てVSCodeで行えるようにします．

ここでは，実行タスクをVSCodeに登録します．
タスクの説明は公式の[Integrate with External Tools via Tasks](https://code.visualstudio.com/Docs/editor/tasks)を参照してください．

`Ctrl+Shift+p`->`タスクランナーの構成`でtasks.jsonを起動します．
仮想環境上で実行するためのタスクを以下の通り記述します．


```json:tasks.json
{
	"version": "0.1.0",

	// The command is tsc. Assumes that tsc has been installed using npm install -g typescript
	"command": "cmd",

	// The command is a shell script
	"isShellCommand": true,

	// Show the output window only if unrecognized errors occur.
	"showOutput": "always",

	// args is the HelloWorld program to compile.
	"args": ["/c"],

	// use the standard tsc problem matcher to find compile problems
	// in the output.
	// "problemMatcher": "$tsc",
    "tasks":    [
        {
            "taskName"  :   "run",
            "suppressTaskName": true,
            "isBuildCommand":  true,
            "args"      :   ["workon <virtualEnvName> & python ${file}"]
        }
    ]
}

```

設定の意図は次の通りです．

- ビルドコマンドのショートカットである`Ctrl+Shift+b`で起動
- `cmd /C`でコマンドプロンプトを実行のたびに起動
- `tasks`で実行するコマンドを`&`で連結し，同一タスク上で実行
 - 仮想化環境`<virtualEnvName>`を起動
 - `${file}`でカレントファイルのPythonコードを実行

## タスクの実行
以下のサンプルプログラムを作成して，`Ctrl+Shift+b`で実行してみます．
`出力`欄に"Hello world!"と表示できたら完了です．

```py3:hello.py
print("Hello world!")
```

これで，開発はVSCode上で完結するようになりました．

# おまけ
## キーバインドの割当を設定する

`File->Preferences->Keyboard shortcutsを`を選択し．
左ペインにデフォルトのキーバインド，右ペインにユーザが設定可能な空のキーバインドが表示されます．

空のキーバインドに以下を登録することで，タスクを起動できます．

```
[
    {
        "key": "ctrl+shift+r",
        "command": "workbench.action.tasks.runTask"
    }
]
```

実行は`ctrl+shift+r`でコマンドパレット起動->"run"で行います．
"run"は、`tasks.json`で登録した"taskName"のこと．