PythonパッケージマネージャPoetryのinstall時に「KeyError」が発生する場合の対処法

2020.12.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CX事業本部の吉川です。
案件でPythonを使っており、パッケージマネージャにPoetryを採用したのですが、GitHub Actions上でエラーが発生しちょっと躓いたため共有します。

環境

  • GitHub Actions
    • runs-on: ubuntu-latest
  • Python 3.8.x
  • Poetry 1.1.4

エラー発生したGithub Actions Workflowファイルの内容

# .github/workflows/build-workflow.yml

- name: install dependencies
  run: |
   poetry install

このような感じでした。

エラーメッセージ

GitHub Actionsが回ると下記エラーが発生しました。

KeyError

'VIRTUAL_ENV'

at /opt/hostedtoolcache/Python/3.8.6/x64/python3.8/os.py:675 in __getitem__
       677│         try:
       678│             value = self._data[self.encodekey(key)]
       679│         except KeyError:
       680│             # raise KeyError with the original key value
    →  681│             raise KeyError(key) from None
       682│         return self.decodevalue(value)
       683│ 
       684│     def __setitem__(self, key, value):
       685│         key = self.encodekey(key)

ちょっと悩まされたのは、このエラーの再現は100%ではなく稀に発生するようで、発生してもRerunするだけで解決してしまう点でした。

(おそらく) 解決法

これは既知の問題のようで、GitHubにissueが上がっていました。

https://github.com/python-poetry/poetry/issues/3199

こちらに付いているコメントによると、

poetry config experimental.new-installer false

を実行すると良いようです。
修正後のGitHub Workflowファイルは次のようになります。

# .github/workflows/build-workflow.yml

- name: install dependencies
  run: |
   poetry config experimental.new-installer false # 追加
   poetry install

いかんせん再現が100%ではない問題なのですぐに解決したと判断することはできないのですが、今のところは再発していません。
この設定でしばらく様子を見たいと思います。

experimental.new-installerとは

https://python-poetry.org/blog/announcing-poetry-1-1-0.html

Poetryは1.1.0から並列インストールをサポートする新インストーラを採用したようです。
ただし、「まだexperimentalだから問題があったらissueで報告してね。そのせいで作業できない場合は poetry config experimental.new-installer false でオフにできるよ」のように言っています。
本記事ではオフにする対応を採ったということでした。

おわりに

PythonパッケージマネージャはPoetry以外にもPipenvもありますし、pipとrequirements.txtで管理するという選択肢もあるかと思います。
今回はPoetryを採用しましたが、どのツールがデファクトスタンダードの座におさまるのか、引き続き注視していきたいと思います。