MkDocsのUnicodeDecodeErrorを解消する

Ken published on
3 min, 477 words

Categories: Programming

Mac(10.11.6)でMkDocsを起動後、ファイルを保存するとエラーが発生する。

[E 170626 17:20:09 ioloop:638] Exception in callback <bound method type.poll_tasks of <class 'livereload.handlers.LiveReloadHandler'>>
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/site-packages/tornado/ioloop.py", line 1026, in _run
        return self.callback()
      File "/usr/local/lib/python2.7/site-packages/livereload/handlers.py", line 67, in poll_tasks
        filepath, delay = cls.watcher.examine()
      File "/usr/local/lib/python2.7/site-packages/livereload/watcher.py", line 73, in examine
        func and func()
      File "/usr/local/lib/python2.7/site-packages/mkdocs/commands/serve.py", line 106, in builder
        build(config, live_server=live_server, dirty=dirty)
      File "/usr/local/lib/python2.7/site-packages/mkdocs/commands/build.py", line 352, in build
        utils.clean_directory(config['site_dir'])
      File "/usr/local/lib/python2.7/site-packages/mkdocs/utils/__init__.py", line 134, in clean_directory
        if entry.startswith('.'):
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

確認

asciiでデコードしようとして発生しているエラーのようなのでUTF-8を扱うように修正するが、まずはasciiを使っているか確認。

$ python
Python 2.7.13 (default, Dec 17 2016, 23:03:43)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.getdefaultencoding()
ascii

asciiを使っていることが明確になったので、UTF-8をデフォルトにするように修正する。

UTF-8をデフォルトにする

まずはpythonが扱っているライブラリパスを調べる。

$ python
Python 2.7.13 (default, Dec 17 2016, 23:03:43)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.7/site-packages/pyserial-3.2.1-py2.7.egg', ...]

/usr/local/lib/python2.7/site-packagesを見ればよさそう。 ここでsitecustomize.pyを修正する。

import.sysの直下にsys.setdefaultencoding('utf-8')を追記。

--- sitecustomize.py.org        2017-06-26 17:36:14.000000000 +0900
+++ sitecustomize.py    2017-06-26 17:26:44.000000000 +0900
@@ -4,6 +4,7 @@
 import re
 import os
 import sys
+sys.setdefaultencoding('utf-8')

 if sys.version_info[0] != 2:
     # This can only happen if the user has set the PYTHONPATH for 3.x and run Python 2.x or vice versa.

解決!

ファイルを保存してもエラーが出なくなった。

mkdocs serve --livereloadと実行しておくと修正がすぐに反映されるのでとても快適。