Windows & プロキシ配下でPythonを開発する君へ

まず言っておくべきなのは、もしあなたがMacかLinuxを持っているならPythonはそれらで開発したほうがいいということだ。

WindowsでのPythonはかなり手間になる。しかし俺のPC、というかWindows以外選択肢がないんだよという方に向け、PythonをWindows、また同じく躓きの元になるプロキシ配下で行う場合の注意点をまとめておきます。

## Pythonのインストール
これは迷うことなく、[Downloadページ](https://www.python.org/downloads/)から・・・と思いきや、そうではなくこちらからダウンロードすることをお勧めしたい。

[Miniconda](http://conda.pydata.org/miniconda.html)

Minicondaとは、Pythonに数学系処理のライブラリをガッツリ詰め込んだ[Anaconda](https://store.continuum.io/cshop/anaconda/)のライト版である。

本家PythonでなくMinicondaを入れる最大の理由は、`conda`コマンドである。
Pythonにおけるパッケージインストールツールである`pip`は、ソースを落としてきて自前の環境でコンパイルするという形式をとっている。しかし、この方式だと`gcc`などのC言語のコンパイル(たまにFortranも)環境がクライアント側に要求され、LinuxやMacならともかくWindowsはそんなの標準搭載していないのでしこたまエラーを食らって泣きを見る羽目になる。

`conda`はコンパイル済みバイナリを落としてきてくれるので、このエラーと無縁になれる。なので、WindowsでやるならMinicondaの搭載をお勧めする。`conda`を入れたからといってvirtualenvが使えないということはないので、必要に応じて使い分ければよい。

condaを利用する場合の仮想環境の構築手順は、以下になる。

```
# condaの仮想環境は`<miniconda home>/envs`に作成される(パスの指定がない場合)
# 仮想環境作成時にpipを入れておかないと、仮想環境を有効化していてもpipがグローバルへのインストールになるので注意
conda -n myenv numpy scipy pip 
activate myenv 
conda install <package>
pip install <package>
```

通常通りvirtualenvを利用する場合は、以下。

```
# virtualenvが未インストールの場合は、pip installで入れておく。
virtualenv venv

# Git shellを利用すれば、source venv/Scripts/activate とできる
venv/Scripts/activate.bat
pip install <package>
```

virtualenvを利用する場合は、上記のようにコンパイルエラーと正面から戦うことになる。この際の基本戦略は、pipでエラーが発生したらまず[Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/)をチェックし、そこにあるexeを利用するという戦法だ。
ここに掲載されているexeは、`easy_install`でインストールでき、仮想環境を有効化していればちゃんと仮想環境にのみ入ってくれる。

## easy_installのインストール
[こちら](https://pypi.python.org/pypi/setuptools#installation-instructions)から`ez_setup.py`をダウンロードし、インストール作業を行う。

うまくいかない場合は、以下参照。

### プロキシの考慮
ファイルダウンロードに使用されているpowershellがプロキシを考慮するようにする。
[ここに紹介されている方法](http://stackoverflow.com/questions/13733375/installing-pythons-easy-install-using-ez-setup-py-from-behind-a-proxy-server)

### Git shellでの実行
Git shellではいくつかのLinuxのコマンドが使えるので、Windows環境の判定をコメントアウトした上で`ez_setup.py`を実行する。
今後も何かとこの方がうまくいくと思われるので、「GitをインストールしておきGit shellからコマンドを打つ」というのはひとつの方策として持っておいたほうがよいと思う。

以下のように編集(常にFalseにする)。

```py3
def has_powershell():
	"""
    if platform.system() != 'Windows':
        return False
    cmd = ['powershell', '-Command', 'echo test']
    devnull = open(os.path.devnull, 'wb')
    try:
        try:
            subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
        except Exception:
            return False
    finally:
        devnull.close()
    return True
	"""
	return False
```

このどちらかで通ると思う。

## 開発環境のインストール
スタンダードにEclipseの場合は、EclipseをダウンロードしPython用の[PyDev](http://pydev.org/download.html)を導入する。
IDEAの場合、PyCharmが利用可能。ただ、コミュニティ版の場合AppEngine連携機能はないので注意が必要(あったからどうという感じのものでもないので、好みかすでにある環境を使えばよい)。
ただ、おそらくどこかのタイミングでVisual C++のコンパイルのためにVisual Studioを入れる羽目になるので、いっそのこと最初からVisual Studioでいくという手もある。パッケージソースのコンパイル時にVisual Studio側のコンパイラが使われるようで、もしかしたらnumpyなどの要コンパイルライブラリをMinGWインストールなしで入れられるかもしれない(少なくともnumpyは入った・・・が、私は既にMinGWやmsysをがっつりインストールしていたので定かではない)。補完もかなり優秀なので、Windowsでやらざるを得ない環境なら開き直ってこれでいくのはありだと思う。

開発時には、Pythonのコーディングスタイルのガイドライン(PEP8)をチェックするようにしておいた方がよい。
Eclipseの場合設定>PyDev>CodeAnalysis>pep8.py、Visual Studioの場合チェックではなく、編集>ドキュメントのフォーマットで成形する形になる。スペースなどの設定はツール>オプション>テキストエディタ>Pythonで可能。フォーマットは任意なので、強制力は緩い。
IDEAの場合はデフォルトで入っており、チェックもきちんとしている。

## Cコンパイラの準備
condaでもUnofficial～でもサポートされていない場合、自前でコンパイルすることになる。

まずは、コンパイラ(MinGW)を用意する。インストーラーは[こちら](http://sourceforge.net/projects/mingw/files/)からだが、このインストーラーはWebからファイルを取得する方式で、認証プロキシ配下だとNGになる(2014年の段階では・・・)。

そのため、[こちら](http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite)のFiles To Getにあるすべてのファイルをダウンロードし、展開する。binutilsはbin、gcc-coreはbinとdll両方、それ以外はdllを取得。tar.lzmaという二回圧縮なので、全ファイル二回展開をして展開したファイルを統合していくことで環境を作る。信じられない手間に驚愕するが、これが現実だ。

あとは、展開したフォルダ(MinGWなど)に環境変数のパスを通せばOK。

仮想環境で使用するコンパイラを指定する場合は、例えばvirtualenvで作成したフォルダをvenvとすると、`venv/Lib/distutils`の中の`distutils.cfg`というファイルを編集することで可能。

```distutils.cfg
[build]
compiler=mingw32
```

 * [UnicodeDecodeErrorが発生した際の対応](http://qiita.com/icoxfog417/items/94f1dd61d02e59a5c1ec)
 * [virtualenvにNumpyをインストールする](http://qiita.com/icoxfog417/items/02e1f6f34dc147afaa27)

## VC++コンパイラの準備
いわゆる`error: Unable to find vcvarsall.bat`エラーに遭遇した場合の対応。これは要するに、VC++のコンパイラがないと言っている。
Windows SDKかVisual Studioをインストールして環境を設定するのが通例だが、最近こんなのが出たようなのでこれだけでも行けるかもしれない。

[Microsoft Visual C++ Compiler for Python 2.7](http://www.microsoft.com/en-us/download/details.aspx?id=44266)
(なぜPython3用がない??)

Pythonのコンパイルされたのと同じバージョンを用意するのが通例だが([こちら](http://matthew-brett.github.io/pydagogue/python_msvc.html)参照)、最新版をインストールしたほうが基本的には良いと思う(セキュリティ的にも)。

Visual Studio Expressをインストールする場合は「Windows Desktop」を選択する。他のバージョンをインストールするとまさかの二度手間になるので気を付けよう。ただ、今後はVisual Studio Communityに一本化されるので選ぶ必要もなくなってくると思う。
インストールは重くて失笑するレベルだが(2014現在)、開発環境としてはかなり優秀なのでここはぐっとこらえて入れておこう。Windows SDKでやる手もあるが、こちらは結構めんどくさい。同じ時間がかかるならインストールを待つ方が楽だろう。なお、Pythonコンパイル時に使用されたVC++コンパイラと最新版では当然バージョン差異が発生する可能性があるため、[こちら](http://mimumimu.net/blog/2014/06/01/python-%E3%81%A7-error-unable-to-find-vcvarsall-bat-%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%80%82/)を参考にレジストリを設定しておく。

## その他Tips
### Pitについて
Pythonでは(pythonに限らないが)、パスワードなどのコミットしたくない情報を管理するためにPitを使用したりする。
このPitを使うにあたっては環境変数EDITORにエディターの実行ファイルへのパスを設定しておく必要があるので、設定しておく。

なお、エディタを設定しても No Changes と言い続けることもある。
その場合は、`C:\Users\ユーザー名`直下にできる.pitフォルダ内にある`default.yaml`を直接編集する。例としては、以下のような感じ。

```
"web-site-password":
  "username": 'xxxxx'
  "password": 'xxxxx'
```

これでOK。

### App Engineを利用する場合
Windowsでも基本的に問題ないが、プロキシを使っていると以下のような感じで落ちる。
これはMacでも同様の模様。

```
Traceback (most recent call last):
  File "C:\environment\Google\google_appengine\lib\webapp2-2.5.1\webapp2.py", line 1547, in __call__
    return response(environ, start_response)
・・・
```

これを回避するには、AppEngine側でプロキシを立ち上げないよう設定する必要がある。具体的には、`...\Google\google_appengine\google\appengine\tools`の`opener.add_handler(fancy_urllib.FancyProxyHandler())`をコメント化する。

```appengine_rpc.py
    opener = urllib2.OpenerDirector()
    # opener.add_handler(fancy_urllib.FancyProxyHandler())
    opener.add_handler(urllib2.UnknownHandler())

```


ただし、これを行った場合外部のAPIはたたけなくなるので注意。また、デプロイするときは逆にこれが邪魔になるので、`appcfg.py`を使う際はこのコメント元に戻す必要あり。

詳しくは[こちら](http://stackoverflow.com/questions/16698621/google-app-engine-error-httperror)を参考。かれこれ2日は苦しめられたのでまさに地獄に仏。