YURUGINoriko
@YURUGINoriko

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python プログラムを複数行バッチで実行しエラーで止まったら次の行を自動実行したい

解決したいこと

python プログラムを複数行バッチで実行しています。
エラーが出たら自動的に強制終了して
次の行のPythonプログラムを実行してほしい

発生している問題・エラー

コマンドプロンプトの黒い画面で止まってしまい、
手作業で Ctrl+C で強制終了して、
バッチプログラムを実行しますか?に
yを入力して次のPythonプログラムを走らせています。

該当するソースコード

言語名.batファイル
rem 仮想環境の立ち上げ
call C:\Users\user_name\Anaconda3\Scripts\activate.bat
call activate XMLTXT
rem 実行したい.pyファイルがあるフォルダに移動
cd C:\Users\user_name\anaconda3\envs\XMLTXT
rem 2000
python_PGM --conf=python_PGM.toml --method=xml > X:\tdmTXT\dataTXT\syuppan\syuppan再実行2000.log
rem 2001
rem .pyファイルの実行
python_PGM --conf=python_PGM.toml --method=xml > X:\tdmTXT\dataTXT\syuppan\syuppan再実行2001.log

rem(年度が2020年まで続きます)

自分で試したこと

Pythonプログラムが異常終了して
止まらなければこのバッチで次々に実行して
うまくいきました。 

Pythonプログラムはアウトソーシングしたもので
エラー処理を内蔵させるような修正を入れることは
できません。 バッチファイルのほうで
エラーを捕まえて強制終了して
次のデータ処理に行くようにしたいです。
データ量によっては長時間かかるので
週末は自動再実行をしてほしいです。

0

1Answer

Pythonプログラムがエラーコードなりを返却してるかです。
通常、Pythonプログラム自体にエラーが発生していると、

sys.exit(1)

などで戻り値でエラー値を返却するしていると思います。
※1なのか9なのか、他の数字なのかは作り方次第ですが。。。
通常はエラー:1、正常:0で戻ってきます。

なので、バッチ側でエラーをハンドリングすることで可能のように
思います。

bat から Python スクリプトのリターンコードを取得する
https://qiita.com/tyochiai/items/697777c8a6a796813742

のように

@echo off
python3 hoge.py
IF %ERRORLEVEL%==0 foo.bat

を参考にして。

と エラー時に %ERRORLEVEL%==1 とすれば、実行するかもですが。。

ただ、黒画面で止まっているのは、どこかでpauseさせるような処理が
python側にありそうな気もします。
その場合は、アウトソーシングされたところに仕様がどうなってるか聞く必要がありますね。

0Like

Comments

  1. @YURUGINoriko

    Questioner

    @f_ryusei0001さん
    ありがとうございます。

    次のコードを入れて実行してみました。

    if %errorlevel% neq 0 (
    echo;
    echo エラー発生:バッチファイルは異常終了しました。
    echo 「errorlevel」は「%errorlevel%」です。

    exit /b
    )

    しかし状況は同じで、Pythonプログラムは
    エラーで異常終了しているのではなくて
    途中で止まっている状態で
    Ctrl+Cで強制終了してやると
    次のコードに行ってくれるという状況でした。

    Pythonプログラムの中で止まらずにスキップする処理を
    考えたほうがいいと思えてきました。
  2. Pythonからエラー発生時に戻ってきてない気がしますね。。

    バッチファイルでマルチタスク処理する方法
    https://golorih.exblog.jp/16183198/

    こちらを参考にして、実行を思い切ってマルチタスクにした方がいいかもです。
    そもそもPython側でエラー時に処理終わってますかね?タスク残ってるような。。

    この場合、pythonプログラムを実行するbatファイルを噛ませつつ、
    start コマンドでpythonプログラム実行数るbatファイルを実行させる
    なんてのがいいかもです。

    まぁ。。python作成したアウトソーシング側に仕様を確認するべきかと。
    エラー時とか処理が時間が掛かったらどうやって終了処理してるのか?
    と聞いておくのがいいかと思いますよ。
    原因がpython側にあるのか?エラーハンドリングの仕方に工夫がいるのか?
    の切り分けが分かると思います。

Your answer might help someone💌