Homebrewで入るPython2.7.11でDjangoのrunserverがコケることに対応したメモ


2015年12月26日現在、homebrewでPython2.x系を入れると2.7.11という名の2.7.10が入ります。
この2.7.11は何かとバグがあり、Djangoを始めとした幾つかのモジュールがうまく動作しません。

Djangoインストール後、

```bash
python manage.py runserver
```

とすると、

```bash
Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    from django.core.management import execute_from_command_line
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 10, in <module>
    from django.apps import apps
  File "/usr/local/lib/python2.7/site-packages/django/apps/__init__.py", line 1, in <module>
    from .config import AppConfig
  File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 5, in <module>
    from django.utils._os import upath
  File "/usr/local/lib/python2.7/site-packages/django/utils/_os.py", line 5, in <module>
    import tempfile
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tempfile.py", line 32, in <module>
    import io as _io
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in <module>
    import _io
ImportError: dlopen(/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
```

という？？？な、エラーが出ます。
詳細はさておき、Python2.7.11のバグによるものとのことらしいので、2.7.10にダウングレードしたい。。。

###Homebrewではマナーバージョンのダウングレードは出来ない

```bash
brew search <package_name>
```

で検索できる範囲のものであれば、バージョンの選択も可能なようですが、Python2.7.10と2.7.11をインストール仕分ける方法は無いようです。ではどうするか？

###Formulaを直接編集する

いろいろ方法を考えたのですが、Formulaを直接編集することにしました。
一旦、pythonを削除しておきます。

```bash
brew remove python
```

Formulaは残っているので、それを編集します。

```bash
brew edit python
```

バージョンに関するところを編集します。

```diff
class Python < Formula
  desc "Interpreted, interactive, object-oriented programming language"
  homepage "https://www.python.org"
  head "https://hg.python.org/cpython", :using => :hg, :branch => "2.7"
-  url "https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz"
+  url "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz"
```

brew edit では、viが起動するので普通に編集して保存します。
保存したら、再度installを実行してみます。

```bash
brew install python
```

すると、当然ですが、SHA256のミスマッチが起こります。

```bash
==> Downloading https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
######################################################################## 100.0%
Error: SHA256 mismatch
Expected: 82929b96fd6afc8da838b149107078c02fa1744b7e60999a8babbc0d3fa86fc6
Actual: eda8ce6eec03e74991abb5384170e7c65fcd7522e409b8e83d7e6372add0f12a
Archive: /Library/Caches/Homebrew/python-2.7.10.tgz
To retry an incomplete download, remove the file above.
```

Actualが実際のコードなので、これをコピーし、再度Formulaの期待値として設定します。

```diff
class Python < Formula
  desc "Interpreted, interactive, object-oriented programming language"
  homepage "https://www.python.org"
  head "https://hg.python.org/cpython", :using => :hg, :branch => "2.7"
  url "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz"
+  sha256 "eda8ce6eec03e74991abb5384170e7c65fcd7522e409b8e83d7e6372add0f12a"
```

こで、再度installを実行します。

```bash
brew install python
```

これでうまくPython2.7.10がインストールされたようです。

###runserverしてみる

では、テストサーバが起動できるか試してみます。

```bash
python manage.py runserver
```

うまく起動したようです。