はじめに
pytest
を触っていると、下記のような Windows fatal exception
が大量に表示されたことはありませんか?
Windows fatal exception: code 0x80010108
Thread 0x0000625c (most recent call first):
File "C:\Users\Hoge\AppData\Roaming\Python\Python38\site-packages\comtypes\__init__.py", line 185 in shutdown
Windows fatal exception: code 0x80010108
Thread 0x0000625c (most recent call first):
File "C:\Users\Hoge\AppData\Roaming\Python\Python38\site-packages\comtypes\__init__.py", line 185 in shutdown
この例外はOSSライブラリに依存するものもあり、こちら側からはどうしようもない場合があります。
本稿では、このような例外が大量に表示される場合の対処法を紹介します。
環境
- python: 3.10.6
- pytest: 7.1.3
結論
下記のオプションをpytest
に追記することで無効化されます。
pytest -p no:faulthandler
faulthandlerとは?
Pythonの標準ライブラリに含まれるモジュールです。
このモジュールは、例外発生時、タイムアウト時、ユーザシグナルの発生時などのタイミングでpython tracebackを明示的にダンプするための関数を含んでいます。これらのシグナル、SIGSEGV、SIGFPE、SIGABRT、SIGBUS、SIGILL に対するフォールトハンドラをインストールするには faulthandler.enable() を実行してください。python起動時に有効にするには環境変数 PYTHONFAULTHANDLER を設定するか、コマンドライン引数に -X faulthandler を指定してください。
(https://docs.python.org/ja/3/library/faulthandler.html より抜粋)
何のことだかといった感じですが、簡潔に言うと「セグフォをスタックトレースに出力するもの」になります。
セグフォとは?
「セグメンテーション違反」というものです。
ソフトウェアがアクセス禁止とされているメモリ上のエリアにアクセスしようとしたり、メモリ上の位置ごとに設定されているルールに違反してメモリにアクセスしようとするときに起こるものである。
(wikipediaより抜粋)
大量に出力されるWindows fatal exception
は、基本的にメモリへのアクセス違反が原因で起こるわけなんですね。
pytest-faulthandlerというプラグインがあったけど…?
pytest
のプラグインとして、pytest-faulthandler
というものがありますが、pytest 5.0
から pytest core
に統合されました。
(詳細はこちら)
下記のオプションはレガシーなため、最初に紹介した方法で無効化してください。
pytest --no-faulthandler
おわりに
筆者がこのエラーに遭遇したのはpywinauto
やcomtypes
で、windowsアプリケーションの自動操作スクリプトをテストしていた時にでした。
似たような境遇で困っている方の一助になると嬉しいです。