ZOAUを呼び出すことで、PythonプログラムからMVSデータセットにアクセスすることができます。以下は、MVSデータセットの内容を読み込んで別のデータセットにコピーするプログラム・サンプルです。ZOA UtilitiesのDatasetsを使用しています。
1 2 3 4 5 6 7 8 9 |
# # ZOAU and Python Program under z/OS. # import os from zoautil_py import Datasets # records = Datasets.read('userid.WORK(MSG1)') Datasets.write('userid.WORK(MSG2)',records) print(records) |
以下が、USSシェルから実行した結果です。
1 2 3 4 5 6 7 8 9 10 |
/u/userid > python3 zoau_test1.py AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 44444444444444444444444444444444444444444444444444444444444444444444444444444444 77777777777777777777777777777777777777777777777777777777777777777777777777777777 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ /u/userid > |
USSシェルからPythonを実行する他に、MVSバッチ・ジョブとして実行することもできます。
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 |
// JOB //********************************************************************* //BUILDSRC EXEC PGM=IKJEFT01 //SYSTSPRT DD DUMMY //SYSTSIN DD * OCOPY INDD(SYSUT1) OUTDD(SYSUT2) TEXT //SYSUT2 DD PATHOPTS=(OWRONLY,OCREAT,OTRUNC), // PATH='/u/userid/zoau_test1.py',PATHMODE=SIRWXU //SYSUT1 DD *,DLM='++' # # ZOAU and Python Program under z/OS. # import os from zoautil_py import Datasets # records = Datasets.read('userid.WORK(MSG1)') Datasets.write('userid.WORK(MSG2)',records) print(records) ++ //********************************************************************* //BPXBATCH EXEC PGM=BPXBATCH,REGION=0M //STDOUT DD SYSOUT=* //STDERR DD SYSOUT=* //STDPARM DD * SH python3 zoau_test1.py /* //********************************************************************* // // |
バッチ処理での実行結果です(ステップBPXBATCHのSTDOUT)。出力側データセット(userid.WORK(MSG2))にも入力側データセットの内容が書き込まれています。
1 2 3 4 5 6 7 8 9 10 11 12 |
SDSF OUTPUT DISPLAY jobname JOB06529 DSID 104 LINE 0 COLS 02- 133 COMMAND INPUT ===> SCROLL ===> CSR ********************************* TOP OF DATA ********************************** AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 44444444444444444444444444444444444444444444444444444444444444444444444444444444 77777777777777777777777777777777777777777777777777777777777777777777777777777777 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ******************************** BOTTOM OF DATA ******************************** |
Datasetファンクション、特にDataset.writeは想像以上に時間が掛かる機能でした。1回の呼び出しで10~20秒程掛かりました(IBM Z14(3906)Processor:3CPU VM Guest)。複数行を書き出す際は、1行ずつDataset.writeを呼び出すより、複数行のデータをまとめて書き出す方が効率が上がります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
data = ["LINE01 LINE01 LINE01 LINE01 LINE01 LINE01 LINE01 LINE01", "LINE02 LINE02 LINE02 LINE02 LINE02 LINE02 LINE02 LINE02", "LINE03 LINE03 LINE03 LINE03 LINE03 LINE03 LINE03 LINE03", "LINE04 LINE04 LINE04 LINE04 LINE04 LINE04 LINE04 LINE04", "LINE05 LINE05 LINE05 LINE05 LINE05 LINE05 LINE05 LINE05", "LINE06 LINE06 LINE06 LINE06 LINE06 LINE06 LINE06 LINE06", "LINE07 LINE07 LINE07 LINE07 LINE07 LINE07 LINE07 LINE07", "LINE08 LINE08 LINE08 LINE08 LINE08 LINE08 LINE08 LINE08", "LINE09 LINE09 LINE09 LINE09 LINE09 LINE09 LINE09 LINE09", "LINE10 LINE10 LINE10 LINE10 LINE10 LINE10 LINE10 LINE10"] data = '\n'.join(data) # Datasets.write('dsname',data) |