ZOAUを呼び出すことで、PythonプログラムからMVS用アプリケーションやユーティリティーなどのプログラムを、JCLを使わずに直接実行することもできます。非同期に実行されるバッチジョブのサブミットと異なり、Python側の処理とMVS側プログラムの処理を容易に同期させることができます。
以下のサンプルは、USSシェル側のPythonプログラムからDFSORTのICETOOLユーティリティーを呼び出すものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# # ZOAU and Python Program under z/OS. # import os from zoautil_py import MVSCmd, Datasets from zoautil_py.types import DDStatement # # define DFSORT/ICETOOL control cards sortctl = [' SORT FIELDS=(15,20,CH,A)', ' SUM FIELDS=(11,4,PD) '] toolin = [" SORT FROM(SYSUT1) TO(SYSUT2) USING(SORT) ", " DISPLAY FROM(SYSUT2) LIST(LISTOUT) - ", " TITLE('SALES RECORD LIST') DATE(4MD-) TIME PAGE -", " HEADER('CUSTOMER NAME') HEADER('AMOUNT') - ", " ON(15,20,CH) ON(11,4,PD,A1) - ", " BLANK - ", " TOTAL('GRAND TOTAL') "] # # write control cards sortctl = '\n'.join(sortctl) Datasets.write('userid.WORK.SORTCNTL',sortctl) toolin = '\n'.join(toolin) Datasets.write('userid.WORK.TOOLIN',toolin) # # build dd statement list ddlist = [] ddlist.append(DDStatement(ddName='TOOLMSG' ,dataset='userid.WORK.TMPLIST1')) ddlist.append(DDStatement(ddName='DFSMSG' ,dataset='userid.WORK.TMPLIST2')) ddlist.append(DDStatement(ddName='SYSUT1' ,dataset='userid.SALES.DATA')) ddlist.append(DDStatement(ddName='SYSUT2' ,dataset='userid.WORK.SORTOUT')) ddlist.append(DDStatement(ddName='LISTOUT' ,dataset='userid.WORK.OUTLIST')) ddlist.append(DDStatement(ddName='SORTCNTL',dataset='userid.WORK.SORTCNTL')) ddlist.append(DDStatement(ddName='TOOLIN' ,dataset='userid.WORK.TOOLIN')) # # call MVS Application/Utility program rc = MVSCmd.execute(pgm='ICETOOL', args='', dds=ddlist) print('Executed PGM=ICETOOL, CC={0}'.format(rc)) # # show utility execution result if rc == 0: print(Datasets.read('userid.WORK.OUTLIST')) else: print(Datasets.read('userid.WORK.TMPLIST1')) print(Datasets.read('userid.WORK.TMPLIST2')) |
JCLと違って、ユーティリティーの制御ステートメントなどを気軽にSYSIN DD *で書くというわけには行きませんので、プログラム内からMVSのPSデータセットにユーティリティーの制御ステートメントを書き出します。次に、MVSCmdファンクション用のDD名リストを組み立てます(JCLを書かない代わりにDD名とDSNの対応リストを作ります)。
作業用データセットにユーティリティーの制御ステートメントを書き出しDD名リストを作成したら、アプリケーションやユーティリティーを呼び出すことができます。MVSCmd.executeファンクションを使ってアプリケーションやユーティリティーのプログラムを実行します(指定したプログラムはMVS側にアドレス空間が生成されて実行されます)。
指定したプログラムの実行処理が終了すると、Python側の続きの処理が行われます。サンプルではプログラムの完了コードをメッセージ出力した後、CC=0であればユーティリティーの実行結果を出力し、そうでなければユーティリティーからのエラーメッセージを出力しています。
以下が、USSシェルから実行した結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/u/userid > python3 zoau_test3.py Executed PGM=ICETOOL, CC=0 1SALES RECORD LIST 2021-07-05 04:45:56 - 1 - CUSTOMER NAME AMOUNT -------------------- -------------------- ABC-COMPANY 2,491,166 BOND STORE 1,534,309 GREAT MARINE SERVICE 2,478,821 KK OIL-COMPANY 1,638,419 MICHELLE CO,LTD. 798,017 MM-CORPORATION 810,362 RED-COMPANY 1,742,529 WBLACK-COMPANY 798,017 WHITE-MOTORS 61,725 GRAND TOTAL 12,353,365 /u/userid > |
次のサンプルは、IDCAMSユーティリティーを実行するものです。IDCAMSはAPF許可プログラムなので、実行にはMVSCmd.execute_authorizedファンクションを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# # ZOAU and Python Program under z/OS. # import os from zoautil_py import MVSCmd, Datasets from zoautil_py.types import DDStatement # # build working datasets Datasets.create("userid.WORK.SYSPRINT",type="SEQ") Datasets.create("userid.WORK.SYSIN",type="SEQ") Datasets.write("userid.WORK.SYSIN"," LISTC LEVEL(SYS1.IODF00)") Datasets.write("userid.WORK.SYSIN"," LISTC LEVEL(SYS1.IODF01)",append=True) # # build dd statement list ddlist = [] ddlist.append(DDStatement(ddName="SYSPRINT",dataset="userid.WORK.SYSPRINT")) ddlist.append(DDStatement(ddName="SYSIN",dataset="userid.WORK.SYSIN")) # # call MVS utility program rc = MVSCmd.execute_authorized(pgm="IDCAMS", args="", dds=ddlist) print('Executed PGM=IDCAMS, CC={0}'.format(rc)) # # show utility execution result print(Datasets.read('userid.WORK.SYSPRINT')) |
プログラムを実行するためのファンクション名がMVSCmd.execute_authorizedに変わるだけで、その他の手続き(制御ステートメントを作業用データセットに格納したりDD名リストの作成など)は同じです。
以下が、USSシェルから実行した結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/u/userid > python3 zoau_test4.py STDERR from ZOAU library call: BGYSC1402E Dynalloc Failure. Error Code: 0x5708, Information Code: 0x00 STDERR from ZOAU library call: BGYSC1402E Dynalloc Failure. Error Code: 0x5708, Information Code: 0x00 Executed PGM=IDCAMS, CC=0 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 1 0 LISTC LEVEL(SYS1.IODF00) 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 2 - LISTING FROM CATALOG -- MASTERV.CATALOG 0CLUSTER ------- SYS1.IODF00.CLUSTER IN-CAT --- MASTERV.CATALOG 0DATA ---------- SYS1.IODF00 IN-CAT --- MASTERV.CATALOG 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 3 - LISTING FROM CATALOG -- MASTERV.CATALOG 0 THE NUMBER OF ENTRIES PROCESSED WAS: AIX -------------------0 ALIAS -----------------0 CLUSTER ---------------1 DATA ------------------1 GDG -------------------0 INDEX -----------------0 NONVSAM ---------------0 PAGESPACE -------------0 PATH ------------------0 SPACE -----------------0 USERCATALOG -----------0 TAPELIBRARY -----------0 TAPEVOLUME ------------0 TOTAL -----------------2 0 THE NUMBER OF PROTECTED ENTRIES SUPPRESSED WAS 0 0IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 4 0 LISTC LEVEL(SYS1.IODF01) 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 5 - LISTING FROM CATALOG -- MASTERV.CATALOG 0NONVSAM ------- SYS1.IODF01.ACTLOG IN-CAT --- MASTERV.CATALOG 0CLUSTER ------- SYS1.IODF01.CLUSTER IN-CAT --- MASTERV.CATALOG 0DATA ---------- SYS1.IODF01 IN-CAT --- MASTERV.CATALOG 0NONVSAM ------- SYS1.IODF01.WORK.ACTLOG IN-CAT --- MASTERV.CATALOG 0CLUSTER ------- SYS1.IODF01.WORK.CLUSTER IN-CAT --- MASTERV.CATALOG 0DATA ---------- SYS1.IODF01.WORK IN-CAT --- MASTERV.CATALOG 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 6 - LISTING FROM CATALOG -- MASTERV.CATALOG 0 THE NUMBER OF ENTRIES PROCESSED WAS: AIX -------------------0 ALIAS -----------------0 CLUSTER ---------------2 DATA ------------------2 GDG -------------------0 INDEX -----------------0 NONVSAM ---------------2 PAGESPACE -------------0 PATH ------------------0 SPACE -----------------0 USERCATALOG -----------0 TAPELIBRARY -----------0 TAPEVOLUME ------------0 TOTAL -----------------6 0 THE NUMBER OF PROTECTED ENTRIES SUPPRESSED WAS 0 0IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0 1IDCAMS SYSTEM SERVICES TIME: 08:36:57 07/04/21 PAGE 7 0 0IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 /u/userid > |
作業用データセットであるuserid.WORK.SYSPRINTとuserid.WORK.SYSINを、その存在の有無に関わらず無条件にDatasets.createしているため、2回目以降の実行ではデータセットのDynallocは失敗しその旨がSTDERRに示されていますが、後続の処理には支障がないのでそのままにしています。作業用データセットは残しておけば、処理が上手く行かないときの診断材料になります。
MVSCmd.executeとMVSCmd.execute_authorizedファンクションは、同期型のMVSプログラムの実行機能です。非同期に実行されるバッチジョブと異なり、指定したプログラムの実行終了後にファンクションから戻ってきます。非定型処理の中で各種のユーティリティー・プログラムを実行するような場合には便利な機能です。