Python

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

More than 1 year has passed since last update.

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

Djangoインストール後、

python manage.py runserver

とすると、

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ではマナーバージョンのダウングレードは出来ない

brew search <package_name>

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

Formulaを直接編集する

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

brew remove python

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

brew edit python

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

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を実行してみます。

brew install python

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

==> 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の期待値として設定します。

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を実行します。

brew install python

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

runserverしてみる

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

python manage.py runserver

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