
Raspberry PiにI2C接続した環境センサの計測値を読み取り、ThingSpeakへ定期送信する Python スクリプトの実行時に、「 ValueError: bad marshal data 」エラーが出るようになったので、その対処法を調べて実行してみます。
BME280環境センサ定期送信スクリプト
初代Raspberry PiにI2C接続した2つの環境センサ(BME280とBH1750)の計測値を、定期的にThingSpeakへ送る仕組みを構築して、仕事場の環境監視に勤しんでいたある日、データが数時間更新されていないことに気づきました。
このRaspberry PiはRTL-SDRレシーバを繋いで、FlightAwareへ観測データ提供を行っているのですが、
そのオンラインステータスを見ると、途切れることなく正常にデータを提供し続けていたことから、システムクラッシュではなさそう。sshで中に入って状況を確認してみることにします。
ValueError: bad marshal data
当時、組み上げたPythonスクリプトは、cronへ次のように登録して定期実行しているので、
1 2 |
# m h dom mon dow user command */5 * * * * pi python /home/pi/sensors_upload.py > /tmp/ssr_upload 2>&1 |
直近の実行結果を収めた /tmp/ssr_upload を確認すると、そこには見慣れぬエラーメッセージが記されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ cat /tmp/ssr_upload Traceback (most recent call last): File "/home/pi/sensors_upload.py", line 10, in <module> import json, requests, time, smbus, board File "/home/pi/.local/lib/python3.7/site-packages/board.py", line 39, in <module> import adafruit_platformdetect.constants.boards as ap_board File "/home/pi/.local/lib/python3.7/site-packages/adafruit_platformdetect/__init__.py", line 10, in <module> from adafruit_platformdetect.board import Board File "/home/pi/.local/lib/python3.7/site-packages/adafruit_platformdetect/board.py", line 26, in <module> from adafruit_platformdetect.constants import boards, chips File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 724, in exec_module File "<frozen importlib._bootstrap_external>", line 857, in get_code File "<frozen importlib._bootstrap_external>", line 525, in _compile_bytecode ValueError: bad marshal data (unknown type code) |
pycキャッシュファイルの削除
エラーメッセージ ValueError: bad marshal data で調べてみると、Pythonファイルのキャッシュファイル *.pyc を削除して作り直すように促すと解消されるとのこと。
但し、キャッシュファイルは自身で組んだPythonスクリプトのみならず、システム広範に渡るので、エラーの挙がっている範囲( /home/pi/.local )に狙いを定めて削除します。
1 2 |
$ find /home/pi/.local -name '*.pyc' -delete $ find /home/pi/.local -name '*.pyc' |
数分後、定期実行されたPythonスクリプトの結果を再び確認してみると、計測値の取得からThingSpeakへのデータ送信まで、正常に実行されたことを確認できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cat /tmp/ssr_upload -- Data -- CPU Temp = 59.99 deg C Illumi1 = 0.00 lux Illumi2 = 0.00 lux Temp1 = 32.14 deg C Temp2 = 32.32 deg C Humidity1 = 35.81 % Humidity2 = 36.81 % Pressure1 = 998.90 hPa Pressure2 = 999.41 hPa PressureZ1 = 1007.29 hPa PressureZ2 = 1007.79 hPa -- ThingSpeak -- <Response [200]> |