IBM i で Python を使ってみよう!!(4)- IBM i コマンドの実行 -

今回は、Python での IBM i コマンドの実行を見ていきたいと思います。具体的には「IBM i で node.js を使ってみよう!!(4)- IBM i コマンドの実行 -」と同じことを Python で実行できるようにするやり方の紹介になります。

今回も「Sample web application with Python」を参考にしています。


IBM i コマンドの実行

さっそくプログラムを見てみましょう。システム名やユーザープロフィール、パスワードなどは適宜変更してください。

コマンド入力用の HTML画面は「IBM i で node.js を使ってみよう!!(4)- IBM i コマンドの実行 -」で使用したものと全く同じもの(cmd.html)を使用しています。

sample_cmd_ibm_db.py

from bottle import request, get, post, static_file, route, run

import ibm_db

# for running commands
from itoolkit import *
from itoolkit.db2.idb2call import *
 
port_number=8889

host_location='nodejs'

file_name='cmd.html'

db_name = '*LOCAL'
username = 'USRPRF'
password = 'PASSWORD'
 

@route('/sample')

def sample():
    return static_file(file_name, root='/home/python/')  


@route('/cmd', method='POST')

def cmd_toolkit():   

    conn = ibm_db.connect(db_name, username, password)

    if conn:

      html_result = "<pre><p>"

    # cl_statement = request.forms.get('cmd')
      cl_statement = request.forms.decode('utf-8').get('cmd')

    # itool = iToolKit(iparm=1, iret=1, ids=1, irow=1)
      itool = iToolKit()
      itool.add(iCmd5250(cl_statement,cl_statement))

      # xmlservice
      itransport = iDB2Call(conn)
      itool.call(itransport)

      # results from list
      output_list = itool.list_out()

      for output_outer in output_list:
         for output_inner in output_outer:
            html_result += output_inner

      # results from dict

      """
      output_dict = itool.dict_out(cl_statement)

      if 'error' in output_dict:
          html_result += (output_dict['error'])
          exit()

      else:
          html_result += (output_dict[cl_statement])

      """

      html_result += "</p></pre>"

      return html_result

    else:

      return "<p>Connection Failed.</p>"

run(host=host_location, port=port_number, debug=True)

↓のように実行します。

ブラウザから /sample でアクセスすると↓のような画面が出てきます。

コマンドを入力して実行してみましょう。

こんなかんじで結果が表示されます。


コマンド実行の処理の流れ

前回の SQL での実行とデータベースの接続までのコーディングはまったく同じです。

IBM i への接続

Import で指定した ibm_db の connect メソッドで DB2 for i に接続します。

import ibm_db
    conn = ibm_db.connect(db_name, username, password)

connect が成功したら、HTML ファイルのフォームからコマンドを受け取り、実行します。

    if conn:

      cl_statement = request.forms.decode('utf-8').get('cmd')

      itool = iToolKit()
      itool.add(iCmd5250(cl_statement,cl_statement))

      # xmlservice
      itransport = iDB2Call(conn)
      itool.call(itransport)

      # results from list
      output_list = itool.list_out()

コマンドの実行

コマンドの実行には、Python用の XMLSERVICE Toolkit というものを使います。「Node.js でも Python でも必要になる XMLService ってどんな機能!?」で紹介した XMLService を使用しますので、そのセットアップが前提になっています。

↓ のように、iToolKit クラスをインスタンス化し、iCmd5250 クラスに実行するコマンドをセットして add します。

      itool = iToolKit()
      itool.add(iCmd5250(cl_statement,cl_statement))

データベースの接続を iDB2Call クラスでインスタンス化したものを上記 iToolKit クラスのインスタンスにセットして call することで、コマンドが実行されるようになっています。

      itransport = iDB2Call(conn)
      itool.call(itransport)

実行結果の取り出し

callした後のiToolKitクラスのインスタンスのlist_outメソッドを使ってリスト形式の出力を取得します。

      output_list = itool.list_out()

ibm_db クラスを使わず iDB2Call クラスにユーザー/パスワードをセットするやり方

前回と今回では IBM i への接続に ibm_db クラスを使いましたが、別のやり方もあります。

↑ で紹介したやり方では iDB2Call クラスに、前もって ibm_db.connect で生成した接続をセットしていますが、iDB2Call クラスの引数に直接ユーザープロフィールとパスワードをセットしてインスタンス化するやり方もあるんです。

      itransport = iDB2Call(conn)
      itool.call(itransport)

      itransport = iDB2Call(username,password)
      itool.call(itransport)

になるわけです。

それに伴って

import ibm_db
    conn = ibm_db.connect(db_name, username, password)

db_name = '*LOCAL'

も不要になります。

接続のコーディングの違いだけなので、もちろん結果はまったく同じになります。

sample_cmd_iDB2Call.py

from bottle import request, get, post, static_file, route, run

# for running commands
from itoolkit import *
from itoolkit.db2.idb2call import *

 
port_number=8889

host_location='nodejs'

file_name='cmd.html'

username = 'USRPRF'
password = 'PASSWORD'
 
@route('/sample')

def sample():
    return static_file(file_name, root='/home/python/')  


@route('/cmd', method='POST')

def cmd_toolkit():   

    html_result = "<pre><p>"

    cl_statement = request.forms.get('cmd')

    itool = iToolKit()
    itool.add(iCmd5250(cl_statement,cl_statement,{'error':'on'}))

    # xmlservice
    itransport = iDB2Call(username, password)
    itool.call(itransport)

    # results from list
    output_list = itool.list_out()

    for output_outer in output_list:
        for output_inner in output_outer:
            html_result += output_inner

    # results from dict

    """
    output_dict = itool.dict_out(cl_statement)

    if 'error' in output_dict:
        html_result += (output_dict['error'])
        exit()

    else:
        html_result += (output_dict[cl_statement])    

    """

    html_result += "</p></pre>" 

    return html_result


run(host=host_location, port=port_number, debug=True)

↓のように実行します。

そのあとの、ブラウザからのコマンドの実行の流れはまったく同じになります。

[Top Pageに戻る]

Ads by TOK2