PythonからMVSアプリケーションやユーティリティーを実行する

ZOAUを呼び出すことで、PythonプログラムからMVS用アプリケーションやユーティリティーなどのプログラムを、JCLを使わずに直接実行することもできます。非同期に実行されるバッチジョブのサブミットと異なり、Python側の処理とMVS側プログラムの処理を容易に同期させることができます。

以下のサンプルは、USSシェル側のPythonプログラムからDFSORTのICETOOLユーティリティーを呼び出すものです。

JCLと違って、ユーティリティーの制御ステートメントなどを気軽にSYSIN DD *で書くというわけには行きませんので、プログラム内からMVSのPSデータセットにユーティリティーの制御ステートメントを書き出します。次に、MVSCmdファンクション用のDD名リストを組み立てます(JCLを書かない代わりにDD名とDSNの対応リストを作ります)
作業用データセットにユーティリティーの制御ステートメントを書き出しDD名リストを作成したら、アプリケーションやユーティリティーを呼び出すことができます。MVSCmd.executeファンクションを使ってアプリケーションやユーティリティーのプログラムを実行します(指定したプログラムはMVS側にアドレス空間が生成されて実行されます)
指定したプログラムの実行処理が終了すると、Python側の続きの処理が行われます。サンプルではプログラムの完了コードをメッセージ出力した後、CC=0であればユーティリティーの実行結果を出力し、そうでなければユーティリティーからのエラーメッセージを出力しています。

以下が、USSシェルから実行した結果です。

次のサンプルは、IDCAMSユーティリティーを実行するものです。IDCAMSはAPF許可プログラムなので、実行にはMVSCmd.execute_authorizedファンクションを使います。

プログラムを実行するためのファンクション名がMVSCmd.execute_authorizedに変わるだけで、その他の手続き(制御ステートメントを作業用データセットに格納したりDD名リストの作成など)は同じです。

以下が、USSシェルから実行した結果です。

作業用データセットであるuserid.WORK.SYSPRINTとuserid.WORK.SYSINを、その存在の有無に関わらず無条件にDatasets.createしているため、2回目以降の実行ではデータセットのDynallocは失敗しその旨がSTDERRに示されていますが、後続の処理には支障がないのでそのままにしています。作業用データセットは残しておけば、処理が上手く行かないときの診断材料になります。

MVSCmd.executeとMVSCmd.execute_authorizedファンクションは、同期型のMVSプログラムの実行機能です。非同期に実行されるバッチジョブと異なり、指定したプログラムの実行終了後にファンクションから戻ってきます。非定型処理の中で各種のユーティリティー・プログラムを実行するような場合には便利な機能です。