#背景
windows+anaconda+コマンドプロンプトでpythonを使っています。ある環境内で作業をする際、コマンドプロンプトを開き、いちいち activate hogehoge
などとするのは非常に面倒です。そこで、コマンドプロンプトを立ち上げた時に、自動的に環境に入る方法を調べました。IDE使えばいいんじゃ
#環境
windows10 64bit
anaconda 1.6.0
#結論
cmdrc書きましょう
#理由
公式の環境操作に関するリファレンスやstackoverflowの質問を見る限り、(ana)conda側では、環境の自動アクティベートに対応していないと思われます。
なので、コマンドプロンプトを起動した際に自動で実行されるファイルを作り、その中で環境をアクティベートする方法が一番簡単だと考えました。
#方法
レジストリを編集します。作業は自己責任で行ってください。
適当なフォルダ(ここではC:\Users\USER\
とします)にcmdrc.bat
というファイルを作り、以下の内容を書きこみます。
@echo off
cd /d %~dp0
if not exist "_TMP" (
type nul > _TMP
activate python_env
del "_TMP"
)
python_env
は各自の環境に置き換えてください。
保存したらレジストリエディタを開き、HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor
の中にAutoRun
という名前で文字列値を作成します。値のデータはcmdrc.bat
へのパスにします。
これを保存したあと、コマンドプロンプトを開けば、環境がアクティベートされた状態で起動するはずです。
#cmdrc.batの解説
@echo off
:コマンドの実行を画面に表示せず行うように設定する命令です。これがないと、このファイル中の実行したコマンドがすべて画面上に表示されます。
cd /d %~dp0
:カレントディレクトリをバッチファイルがある場所に移動させるコマンドです。コマンドプロンプト起動直後はC:\WINDOWS\System32
にカレントディレクトリが設定されているので、そのままだと後述する_TMP
ファイルが作成できません。
if not exist "_TMP" (
type nul > _TMP
activate python_env
del "_TMP"
)
単にactivate python_env
とするのではなく、_TMP
が存在するかどうかで処理を変えています(存在する場合は何もしない)。
場合分けを書かずにactivate python_env
とだけしたところ、コンピューターが大量にメモリを消費し、コマンドプロンプトがフリーズしました。おそらく、activateを実行する際に裏で新たにバッチファイルを起動していて、バッチファイル起動→activateを実行→activateがバッチファイル起動→そのバッチファイルがactivateを実行…と無限にバッチファイルが実行されてしまうのではないかと思います。
最初の実行で_TMP
というファイルを作成し、それ以降のバッチファイルではactivate
を実行させないようにすることで、無限ループを防いでいます。
#参考サイト
http://c4se.hatenablog.com/entry/2012/10/19/230718
http://www.confrage.com/dos/batch-grammar/if/if.html
http://d.hatena.ne.jp/nakamura001/20090203/1233652705
https://www.k-tanaka.net/cmd/del.php
http://qiita.com/is_books/items/44d4cda4e11e194b8345
http://kiyotakakubo.hatenablog.com/entry/20090214/1234622897