Anacondaの仮想環境を切り替えるSimple is Best 方法

#背景
仕事で使用しているライブラリーの一部がPython2系しか対応しておらず、2系と3系をそれぞれインストールして[環境変数PY_PYTHON](https://docs.python.jp/3/using/windows.html#customizing-default-python-versions) を書き換えることで切り替えを行っていた。
そして今回、3系の中でも開発環境ごとにモジュールのバージョンを分けたいということでAnacondaを導入した。
しかし、Anacondaではこれまでの方法が利用できなくなっため下記の条件を満たすように新しい方法を考えた。

- 基本は同じ仮想環境で良いが、ものによって仮想環境を切り替えられる。(切り替え頻度はそんなに高くない)
- pythonプログラムをデータ処理に利用したいため、コマンドプロンプトから引数などを付けても呼び出せる。
- 開発環境が接続する仮想環境も切り替えられる。

以上のことが行えるように開発環境の設定を変更したり、シェバン的なことをしてみたり試行錯誤したが、思わぬほどシンプルな方法があったので記事を書いた。


#想定環境
以下の環境で今回の方法は検証した。（環境によって画面やコマンドは変わるが他のOS、統合開発環境にも応用可能である。）

- Windows 10 Pro 16299
- Anaconda3 5.1.0
- Visual Studio Code 1.20.1 (ms-python.python 2018.1.0 installed)

すでにAnaconda、VS Codeのインストール、構築は完了しているものとする。

#方法
Anacondaで作成した仮想環境のジャンクションを作成して、PATH
を通すことで、ジャンクションを書き換えるだけでコマンド上のpythonが強制的に切り替えらえる。また開発環境でpythonインタープリタを設定しなければならない場合もそのジャンクションを指定しておけば同時に切り替えらえる。（統合開発環境がAnacondaなど仮想環境に対応している場合は適宜設定すると良い）

"py2"と"py3"という仮想環境が作成済みである。
<img src="https://qiita-image-store.s3.amazonaws.com/0/157792/8976cf8c-f175-b6ae-24be-d9532755a12a.png" alt="image1.png" width=80%>

`C:\Users\abmolniya\Anaconda3\CurrentPy`に`C:\Users\abmolniya\Anaconda3\envs\py2`へのジャンクションを作成する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/157792/4133aaf1-a305-ac56-4ffd-12c4fa9b1b21.png" alt="image2.png" width=100%>

環境変数にジャンクションを追加する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/157792/e33d695a-9e24-ba6a-ba8d-da4b0a6e1f6a.png" alt="image3.png" width=60%>

コマンドプロンプトでpythonを指定すると設定した仮想環境のpythonが呼び出された。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/157792/40e4979a-6fc8-4354-0438-1bffc4922d6d.png)

VS Codeの設定ファイルpython.pythonPathのパスを作成したジャンクション内のpython.exeを指定すると連動して開発環境のpythonも切り替わる。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/157792/1ccebeea-6fde-9c90-2294-e8a39bec842f.png)


#切り替えの簡単化
前章のジャンクションの切り替えを簡単に行うためにバッチファイルを作成したのでいかに記しておく。（Anaconda3をデフォルト設定でインストールした場合は以下のコードでうまく動くはず。）

```shell:AnaPython.bat
:init_bat
@echo off
setlocal enabledelayedexpansion
cd /d %USERPROFILE%\Anaconda3

:get_currentpy
for /f "usebackq tokens=5" %%a in (`dir ^| findstr "\<\<JUNCTION\>\>" ^| findstr "\<CurrentPy\>"`) do @set result=%%a
if not "%result%"=="" ( call :get_currentpy_name %result%)
echo 現在の仮想環境は「%result%」です。
set /P input=変更しますかy/n：
if /i not "%input%"=="y" ( goto finish_bat)

:select_currentpy
cls
echo アクティブにする仮想環境の番号を入力してください
set /A i=1
for /f "usebackq" %%a in (`dir /b envs`) do (
    echo !i! ← %%a
    set envs[!i!]=%%a
    set /A i=i+1
)
set /P input=：
if /i "!envs[%input%]!"=="" ( goto select_currentpy)

:set_currentpy
rmdir CurrentPy
mklink /J CurrentPy envs\!envs[%input%]!

:finish_bat
timeout /T 3
goto :EOF

:***Subroutine***
:get_currentpy_name
set result=%~n1
set result=%result:~-261,-1%

```


上記のプログラムを`C:\Users\abmolniya\Anaconda3\AnaPython.bat`に保存した場合、それをコマンドプロンプトで開くショートカット（`C:\Windows\System32\cmd.exe /k C:\Users\abmolniya\Anaconda3\AnaPython.bat`）を作成する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/157792/21280beb-55e1-e731-3c77-ad389f6d65b8.png" alt="image3.png" width=50%>

この作成したショートカットを右クリックして「タスクバーにピン止めする」を選択することでいつでも切り替えが簡単に行える。


#あとがき
背景に書いたような状況の人は他にもいると思い、インターネットで検索をかけたが、全くヒットしなかった。Unixのシェバン的なことができればもっと楽だと思うのだが、何も思いつかずこのような方法となった。何かもっと良い方法があるのであれば教えてほしい。