Windows自動化で黙って壊れる罠3つ|エラーが出ない

自作のツールを動かしとると、たまに「エラーは出てへんのに、結果だけが間違っとる」ことがあります。Windowsで自動化を組んどると、これが妙に多い。この記事は、ここ数日で立て続けに踏んだ罠3つの話です。

3つに共通しとるのは、赤いエラーが出んことです。プログラムは最後まで走って、正常に終わりました、みたいな顔をする。それで先の工程まで進んでから、だいぶ後になって気づく。

先に断っておくと、これは自分でスクリプトを書いて自動化しとる人向けの話です。これから副業を始める段階の人には、まだ関係のない世界やと思います。

罠1|pythonと打っても、何も起きんまま終わる

pythonと打った黒い画面がエラーも出さず終わり、本物ではなくダミーが反応している様子
打ったのに動かず、静かに終わる罠

Windowsで python と打つと、本物やなくてストアへ誘導するためのダミーが反応することがあります。最初からPATHに居座っとるやつです。

エラーは出ません。ストアの画面が開くか、そのまま静かに終わるか。手で打っとる時は「あれ?」で気づけますが、スクリプトの中から呼んどる時が厄介です。呼んだ側は実行したつもりで次に進みます。

自分の環境では py のほうを使えば通りました。python が動かんと言うてる時、入ってへんとは限らんという話です。

罠2|引数にURLが混ざると、改行が消える

これがいちばんタチ悪かったです。

WindowsのGit Bash(Windowsに入れる、Mac風のコマンド画面です)からコマンドを叩く時のことです。渡す文字列の中にスラッシュが2つ並んだところ(URLの頭にあるアレです)が入っとると、その文字列まるごとがファイルの置き場所やと誤解されて、勝手に書き換えられます。

言葉やと伝わりにくいので実物を出します。改行してほしい場所には、バックスラッシュとnを並べた印を書きます。それがこうなりました。

書いたつもり: 1行目\n2行目
実際に届いた: 1行目/n2行目

印が印やなくなったので、改行はされません。かわりに /n という文字がそのまま本文に残る。エラーは1つも出ませんでした。

自分は記事の下書きを書き出すスクリプトで踏みました。改行のつもりで書いた指定が別の文字に化けて、改行ゼロの1行だけのファイルができあがった。同じ日にもう1件、記事の中のリンクが壊れて表示が死にました。

気持ち悪いのは、同じスクリプトでもURLの無い引数では起きんことです。前の日まで普通に動いとった。壊れる日だけ、たまたまリンクを本文に入れとったというだけの違いでした。

今日できることを1つだけ挙げるなら、URLを含む文字列をコマンドに渡しとる箇所を探して、書き出した結果のファイルを1回だけ目で開いてみることです。改行が消えとらんか、それだけ見れば分かります。

罠3|中身はJPEGやのに、pngの名前で保存しとった

画像を作るAPIを叩いて、返ってきたデータをファイルに保存する処理。保存する名前をpngにしとったんですが、返ってきた中身は実はJPEGでした。

ファイルは普通に開けます。画像も見られる。壊れとるように見えません。詰まったのはWordPressにアップする時で、名前から判断した種類と中身が合わんと弾かれました。

直し方は変換やなくて、保存する時の名前をjpgにするだけでした。

こっちも今日できることは1つ。外から受け取ったデータを自分で名前を決めて保存しとるなら、その名前が中身と合っとるか一度だけ確かめる。自分で決めた名前ほど、疑う対象から外れがちです。

3つとも、止まってくれんかった

エラーで止まるバグは親切です。その場で気づけるから。今回の3つは全部、処理が最後まで走りきってから、後ろの工程で困る形でした。

  • ダミーのpythonは、呼んだ側が実行したと思ったまま次へ進む
  • 渡した文字列の化けは、ファイルが正常に書けてしまう。中身だけ違う
  • 拡張子の食い違いも、保存そのものは成功しとる

3件とも、見つけたのは自分やなくて後ろの工程です。アップロードで弾かれて初めて分かる、公開したページを見て初めて分かる。作った本人が一番遠いところにおる形でした。

対策=おかしかったら、書かずに止める

警告を出して書き続ける方式と、1文字も書かずに止める方式を比べた図
警告だけ出して進むより、その場で止めた方が気づける

2つ目の罠は実際に手を入れました。書き出すスクリプトの入口に、化けの痕跡を探す検査を足しています。ありえん形(化けた後の文字だけがあって、元の指定が1つも無い)を見つけたら、1文字も書かずにその場で止まる。

意識したのは、警告だけ出して書くのは続ける、にせんかったことです。警告は後から読む前提になるので、無人で動いとる時は誰も読みません。止めるなら本当に止める。

もうひとつ、検査を足したあとに「普通の本文まで弾いてへんか」を必ず試すようにしました。厳しくしすぎると、今度は何ともない日に何も出せんくなる。壊れた例と壊れてへん例を両方通して、狙ったやつだけ止まるのを見てから本番に入れます。ここを飛ばすと、事故を直したつもりで別の事故を仕込むことになります。

エラーが出てへんのは、無事の証拠にならん

実行してエラーなしでも、あとの工程で問題が発覚するまで時間差があることを示す図
エラーなしでも、後の工程で問題が出る

3つとも、AIに実装を任せた部分で出ました。コードの中身は正しく書けとる。ただ、動かす環境の癖までは面倒を見てくれません。

Windowsで自動化を組む時は、エラーが出てへんことを無事の証拠にせんほうがええです。出したかったものが本当に出とるか、最後まで自分の目で見に行く。今のところ、それ以外に手はなさそうです。

あわせて読みたい