よしだです

プログラミングの勉強してます

Python2.6でvirtualenvwrapper.shにエラーが出る

Pythonを覚えようと思い、とりあえず環境構築だーということでVagrant上でvirtualenvをインストール。

すると、途中でこんなエラーが出てうまくいかない。

Traceback (most recent call last):
  File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.6/site-packages/virtualenvwrapper/hook_loader.py", line 16, in <module>
    from stevedore import ExtensionManager
  File "/usr/lib/python2.6/site-packages/stevedore/__init__.py", line 23, in <module>
    LOG.addHandler(logging.NullHandler())
AttributeError: 'module' object has no attribute 'NullHandler'
virtualenvwrapper.sh: There was a problem running the initialization hooks.

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python and that PATH is
set properly.

エラーを読むとここが問題っぽそうだな

AttributeError: 'module' object has no attribute 'NullHandler'

ということで調べてみると、

https://bitbucket.org/virtualenvwrapper/virtualenvwrapper/issues/289/missing-nullhandler-on-python-26

こんなものを発見。

どうやらPython2.6ではNullHandlerとかいうものはサポートされていないらしい。 とはいえ、システムのPythonのバージョンは変えたくないので、

sudo vi /usr/lib/python2.6/site-packages/virtualenvwrapper/hook_loader.py

ソースコードを書き換え。

importの下に、リンク先にあるコードをコピペ。

import inspect
import itertools
import logging
import logging.handlers
import optparse
import os
import sys

try: 
    from logging import NullHandler
except ImportError:
    class NullHandler(logging.Handler):
        def emit(self, record):
            pass
    logging.NullHandler = NullHandler

これで無事に動きました。