Python

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

More than 3 years have 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

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