戦えプログラマン

いつだって戦いなのだ

dotenv で UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 13: illegal multibyte sequence

概要

テスト実行したら、dotenvがユニコード周りでエラーを吐く
つい先日まで動いてたはずなんだけど・・・

状況

Pipfile (抜粋)

[scripts]
test = "python -m unittest discover --locals -v -s ./test"

Git Bash

$ pipenv run test
Loading .env environment variables...
Traceback (most recent call last):
  File "c:\python3.6.5\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python3.6.5\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python3.6.5\Scripts\pipenv.exe\__main__.py", line 9, in <module>
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "c:\python3.6.5\lib\site-packages\pipenv\cli.py", line 701, in run
    do_run(command=command, args=args, three=three, python=python, pypi_mirror=pypi_mirror)
  File "c:\python3.6.5\lib\site-packages\pipenv\core.py", line 2245, in do_run
    load_dot_env()
  File "c:\python3.6.5\lib\site-packages\pipenv\core.py", line 145, in load_dot_env
    dotenv.load_dotenv(denv, override=True)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 257, in load_dotenv
    return DotEnv(f, verbose=verbose).set_as_environment_variables(override=override)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 94, in set_as_environment_variables
    for k, v in self.dict().items():
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 73, in dict
    values = OrderedDict(self.parse())
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 80, in parse
    for line in f:
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 13: illegal multibyte sequence

原因

「.env」ファイル内に日本語を書き込んでいたことが原因だった。
各変数に丁寧にコメント書き足したら、それをdotenvが読み込めなくなってしまった、的な。

対処

「.env」ファイルから日本語行を削除。
コメントを書くなら、下記どっちかにする。

  • 「.env.example」ファイルのみにコメントを書く
  • dotenvファイルのコメントは全て英語で書く