Jython での wsadmin スクリプトの使用

Jython は、 Pythonの代替実装であり、完全に Java™で記述されています。

wsadmin ツールは Jython V2.7 を使用します。 以下の情報は、Jython 構文の基本的な要約です。 すべてのサンプル・コードで、行頭の => 表記は、コマンドまたは関数出力を表しています。

追加の Jython V2.7 固有の情報については、 Jython V2.7 の動作の変更 を参照してください。

Jython V2.1 が必要な場合は、以下のいずれかの方法でそれを明示的に構成する必要があります。

  • 次のように、wsadmin コマンドを使用して Jython V2.1 を指定する。
    wsadmin -conntype soap -usejython21 true -f test.py
  • 次のように、wsadmin.properties ファイル内のカスタム・プロパティーを使用して Jython V2.1 を指定する。
    com.ibm.ws.scripting.usejython21=true

    デフォルト値は false です。

留意事項: Jython ライブラリー・モジュールは、 WebSphere Application Server バージョン 9.0の Jython バイナリーに付属しています。 ただし、Jython ライブラリー・モジュールに関する問題が発生しても、技術サポートは行いません。 Jython の技術的な問題については、 Jython プロジェクトに質問を投稿してください。

基本関数

関数は、組み込み関数の名前か Jython 関数のいずれかです。 例えば、以下の関数は「Hello, World!」を返します。 出力として:

print "Hello, World!"
=>Hello, World!

import sys
sys.stdout.write("Hello World!\n")
=>Hello, World!

例では、print は標準出力ストリームを示しています。 上記の例のように、 import ステートメントを実行することによって組み込みモジュールを使用することができます。 import ステートメントは、モジュール内のコードをインポートの一部として実行し、 モジュール・オブジェクトを戻します。 sys は、Python 言語の組み込みモジュールです。 Python 言語では、モジュールは名前空間であり、 そこでは名前が作成されます。 モジュール内に常駐する名前は属性と呼ばれます。 モジュールはファイルに対応しており、 Python 言語はモジュール・オブジェクトを作成して、 ファイル内に定義されたすべての名前を格納します。 すなわち、モジュールは名前空間です。

問題の回避: WebSphere Application Server MBean 操作を呼び出す wsadmin スクリプトで Jython コマンドを発行すると、 MBean メソッドは、フランス語のアクセント文字などの NLS 翻訳済み文字を含むストリングを返し、Jython が自動的にそのストリングを Python Unicode ストリングに変換して、以下を返します。 ストリングを wsadmin に変換しました。 MBean メソッドを呼び出すスクリプトに Jython print 出力コマンドを組み込むと、MBean メソッドが wsadmin に戻すストリングには、python ユニコード値ではなく NLS 翻訳済み文字が組み込まれます。 NLS 翻訳済み文字が表示されないようにするには、MBean の戻りの変数 (例えば、output = AdminControl.invoke(mbean)) を使用して、print 出力を使用します。 Jython print コマンドを使用して、NLS 翻訳済み文字が含まれるストリングを正しく変換します。
問題の回避: WebSphere Application Server MBean 操作を呼び出す wsadmin スクリプトで Jython コマンドを発行すると、MBean メソッドは、フランス語のアクセント文字などの NLS 翻訳文字を含むストリングを返します。Jython は、そのストリングを自動的に Python Unicode ストリングに変換し、変換されたストリングを wsadmin に返します。 その MBean メソッドを起動するスクリプトに Jython 印刷出力コマンドを組み込むと、MBean メソッドが wsadmin に戻すストリングには、python ユニコード値ではなく NLS 翻訳済み文字が組み込まれます。 NLS 翻訳済み文字が表示されないようにするには、 MBean の戻りの変数 (例えば、output = AdminControl.invoke(mbean)) を使用して、print output を使用します。 Jython print コマンドにより、NLS 翻訳済み文字を含むストリングを正しく変換します。

変数

オブジェクトを名前に割り当てるには、割り当てのターゲットを等号 (=) の左側に置き、割り当てるオブジェクトを右側に置きます。 左側のターゲットは名前またはオブジェクト・コンポーネントとなり、 右側のオブジェクトはオブジェクトを計算する任意の式となります。 オブジェクトを名前に割り当てる際には、以下の規則が存在します。

  • 割り当てによって、オブジェクト参照が作成されます。
  • 名前は、割り当てる際に作成されます。
  • 名前は、参照する前に割り当てる必要があります。

変数名規則は、C 言語の規則に似ています。 例えば、変数名は、1 つの下線文字 (_) または文字に加えて、任意の数の文字、 数字、または下線を含むことができます。

以下の予約語は、変数名に使用することはできません。
  • および
  • as
  • assert
  • break
  • クラス
  • continue
  • def
  • del
  • elif
  • それ以外の場合
  • except
  • exec
  • finally
  • の場合
  • from
  • global
  • の場合
  • import
  • in
  • 次と同一である
  • lambda
  • not
  • または
  • pass
  • 印刷
  • raise
  • 返す
  • 試行
  • while
  • 置き換え後
  • yield

例:

a  = 5
print a
=> 5

b =  a
print b
=> 5

text1, text2, text3, text4  = 'good', 'bad', 'pretty', 'ugly'
print text3
=> pretty

2 番目の例では、変数 a の値を変数 b に割り当てています。

タイプと演算子

以下のリストには、組み込みオブジェクト・タイプの例が含まれています。

  • 数字。 例:
    8, 3.133,  999L,  3+4j
    
    num1 = int(10)
    print num1
    => 10
  • ストリング。 例:
    'name',  "name's", ''
    
    print str(12345)
    => '12345'
  • リスト。 例:
    x = [1, [2,  'free'], 5]
    y = [0, 1, 2, 3]
    y.append(5)
    print y
    => [0, 1, 2, 3, 5]
    
    y.reverse()
    print y
    => [5, 3, 2, 1, 0]
    
    y.sort()
    print y
    => [0, 1, 2, 3, 5]
    
    print list("apple")
    => ['a', 'p', 'p', 'l', 'e']
    
    print list((1,2,3,4,5))
    => [1, 2, 3, 4, 5]
    
    test = "This is a test"
    test.index("test")
    => 10
    
    test.index('s')
    => 3

以下のリストには、演算子の例が含まれています。

  • x or y

    y は、x が偽である場合にのみ評価されます。 例:

    print 0 or 1
    => 1
  • x and y

    y は、x が真である場合にのみ評価されます。 例:

    print 0 and 1
    =>  0
  • x + y , x - y

    加算と連結、減算。 例:

    print  6 + 7
    => 13
    
    text1 = 'Something'
    text2 = ' else'
    print text1 + text2
    => Something else
    
    list1 = [0, 1, 2, 3]
    list2 = [4, 5, 6, 7]
    print list1 + list2
    => [0, 1, 2, 3, 4, 5, 6, 7]
    
    print  10 - 5
    => 5
  • x * y, x / y, x % y

    乗算と反復、除算、剰余とフォーマット。 例:

    print 5 * 6
    => 30
    
    print 'test' * 3
    => test test test
    
    print 30 / 6
    => 5
    
    print 32 % 6
    => 2
  • x[i], x[i:j], x(...)

    指標付け、スライス、関数呼び出し。 例:

    test = "This is a test"
    print  test[3]
    => s 
    
    print test[3:10]
    => s is a
    
    print test[5:]
    => is a test
    
    print test[:-4]
    => This is a 
    
    print len(test)
    => 14
    
  • <, <=, >, >=, ==, <>, !=, is is not

    比較演算子、識別テスト。 例:

    L1 = [1, ('a', 3)]
    L2 = [1, ('a', 2)]
    L1 < L2, L1 == L2, L1 > L2, L1 <> L2, L1 != L2, L1 is L2, L1 is not L2
    => (0, 0, 1, 1, 1, 0, 1)

円記号置換

ステートメントが複数行にまたがる必要がある場合は、前の行の末尾に円記号 (&#xa5;) を追加して、次の行に継続することを示すこともできます。 円記号の後ろには、空白文字、具体的にはタブやスペースを使用しないでください。 例:

text =  "This is a test of a long lines" \
" continuing lines here."
print text
=> This is a test of a long lines continuing lines here.

関数と有効範囲

Jython では、def ステートメントを使用して関数を定義します。 関数に関連するステートメントには、以下のものが含まれます。
  • def, return

    def ステートメントは、 関数 object を作成してそれを名前に割り当てます。 return ステートメントは、結果オブジェクトを呼び出し元に戻します。 これはオプションであり、これがない場合は関数が終了するため、 制御フローは関数本体で途切れます。

  • global

    global ステートメントは、 割り当てるモジュール・レベルの変数を宣言します。 デフォルトでは、関数内に割り当てられた名前はすべて、 その関数に対してローカルであり、その関数が実行している間のみ存在します。 名前を囲みのモジュール内に割り当てるには、 関数を global ステートメントの中にリストします。

関数を定義する基本構文は、以下のとおりです。

def name (arg1, arg2, ... ArgN)
   statements
   return value

ここで、name は、定義される関数の名前です。 その後に、開き括弧、閉じ括弧、およびコロンが続きます。 括弧内の引数には、プロシージャーに対するパラメーターのリストなどがあります。 コロンの次の行は、関数の本体です。 コマンドのグループが関数の本体を形成しています。 Jython 関数は、いったん定義された後は、他の組み込み関数と 同じように使用されます。 例:

def intersect(seq1, seq2):
   res = []
   try:
      for x in seq1:
         if x in seq2:
            res.append(x)
   except:
      pass
   return res

この関数を呼び出すには、以下のコマンドを使用します。

s1 = "SPAM"
s2 = "SCAM"
intersect(s1, s2)
=> [S, A, M]

intersect([1,2,3], (1.4)) 
=> [1]

コメント

Jython 言語でコメントを作成する場合は、ポンド記号 (#) を使用します。

コマンド行引数

Jython シェルは、 コマンド行引数を sys.argv の値としてスクリプトに渡します。 wsadmin Jython では、プログラムまたはスクリプトの名前は sys.argv の一部ではありません。 wsadmin Jython とは異なり、Jython はスタンドアロン では、スクリプト・ファイルをスクリプトの最初の引数として使用します。 sys.argv は配列であるため、index コマンドを使用して引数リストから項目を抽出します。 例えば、test.py は 3 つの引数 a、b、および c を受け取ります。

wsadmin -f test.py  a  b  c

test.py内容:

import sys
first  =  sys.argv[0]
second = sys.argv[1]
third = sys.argv[2]
arglen = len(sys.argv)

基本ステートメント

ループ・ステートメントには、whilefor の 2 つがあります。 条件ステートメントは if です。 エラー処理ステートメントは try です。 最後に、制御フローを微調整するステートメントには、 breakcontinue、および pass があります。

の場合

if ステートメントは、実行するアクションを選択します。 if ステートメントは、 他の if ステートメントを含め、その他のステートメントを含むことができます。 if ステートメントの後には、1 つ以上のオプションの elif ステートメントを続けることができ、オプションの else ブロックで終了します。

if ステートメントの一般的な書式は、以下のようになります。

if test1
   statements1
elif test2
   statements2
else
   statements3

例:

weather = 'sunny'
if weather == 'sunny':
   print "Nice weather"
elif weather == 'raining':
   print "Bad weather"
else:
   print "Uncertain, don't plan anything"
while

while ステートメントは、テスト式の付いたヘッダー行、 1 つ以上のインデントされたステートメントの本体、 およびオプションの else ステートメントで構成されています。else ステートメントは、 制御が break ステートメントを検出することなくループを終了した場合に実行されます。 while ステートメントは、 ヘッダー行でテストが真の値を評価し続けている限り、 インデントされたステートメントのブロックを繰り返し実行します。 while の例は、以下のとおりです。

while test1
   statements1
else
   statements2

例:

a = 0; b = 10
while a < b:
   print a
   a = a + 1
の場合

for ステートメントは、 割り当てターゲットを指定するヘッダー行、 およびステップスルーするオブジェクトと一緒に始まります。 ヘッダーの後ろには、反復したいインデントされたステートメントのブロックが続きます。

for ステートメント の例は以下のとおりです。

for target in object:
   statements
else:
   statements

これは、シーケンス・オブジェクト内の項目を 1 つずつターゲットに割り当てて、 それぞれのループ本体を実行します。 ループ本体は通常、割り当てターゲットを使用して、 シーケンスをステップスルーしているカーソルのように、 シーケンス内の現在の項目を参照します。 例:

sum = 0
for x in [1, 2, 3, 4]:
   sum = sum + x
break、continue、および pass

ループを breakcontinue、 および pass ステートメントで制御できます。 break ステートメントは、最も近い囲みループを飛び越します (ループ・ステートメント全体を越えて)。 continue ステートメントは、最も近い囲みループの先頭 (ループのヘッダー行に) にジャンプし、 pass ステートメントは空ステートメントのプレースホルダーです。

試行

ステートメントは、間違った数の引数を指定して呼び出された場合、 あるいはその実装に特定のエラー状態を検出した場合、 エラーを起こします。 キャッチされていないエラーは、スクリプトの実行を停止します。 try ステートメントは、そのようなエラーをトラップするために使用されます。 Python の try ステートメントは、2 つの種類に分けられます。 一方は例外を処理し、他方は実行が行われるか否かに関係なく、 ファイナライズ・コードを実行します。 tryexceptelse の各ステートメントは、 try ヘッダー行で始まり、その後ろに、インデントされたステートメントのブロック、 キャッチする例外を指定する 1 つ以上のオプションの except 文節、 および最後にオプションの else 文節が続きます。 tryfinally ステートメントは、try ヘッダー行 で始まり、その後ろに、インデントされたステートメントのブロックがあり、次に、 その try ブロックの実行中に例外が発生したかどうかに関係なく終了前に必ず 実行される finally 文節が続きます。

tryexceptelse 関数の 例は以下のとおりです。

try:
   statements
except name:
   statements
except name, data:
   statements
else
   statements

例:

try: myfunction() except: import sys print 'uncaught exception', sys.exc_info() try: myfilereader() except EOFError: break else: process next line here

try および finally ステートメントの一般的な書式は、以下のようになります。

try
   statements
finally
   statements

例:

def divide(x, y):
   return x / y

def tester(y):
   try:
      print divide(8, y)
   finally:
      print 'on the way out...'
以下に、Python における構文規則のリストを示します。
  • ステートメントは、デフォルトでは順番に実行されます。 ステートメントは通常、それが指定されている行の末尾で終了します。 ステートメントが長過ぎて、1 行に収まらない場合、 前の行の末尾に円記号 (&#xa5;) を追加して、 次の行に継続することを示すこともできます。
  • ブロックおよびステートメントの境界は自動的に検出されます。 コードのブロックの周辺には、 中括弧や、開始または終了の区切り文字はありません。 その代わりに、Python 言語では、 ネストされたブロック内のステートメントをグループ化するため、 ヘッダーの下でステートメントのインデントを使用します。 ブロック境界は、行インデントによって検出されます。 同じ距離だけインデントされたステートメントはすべて、 より少なくインデントされた行によってそのブロックが終了されるまで、 同じブロックのコードに所属します。
  • 複合ステートメントのパターン = ヘッダー ':' インデントされたステートメント。 Python 言語では、複合ステートメントはすべて、同じパターンに従います。 すなわち、ヘッダー行がコロンで終了し、 その後に、ヘッダーの下でインデントされた 1 つ以上のネストされたステートメントが続きます。 インデントされたステートメントは、ブロックと呼ばれます。
  • スペースおよびコメントは通常、無視されます。 ステートメントおよび式の中のスペースは、 ほとんどすべての場合無視されます (ストリング定数およびインデント内を 除く)。コメントも同様です。

別のスクリプトによるスクリプトの呼び出し

Jython スクリプトを別の Jython スクリプトから呼び出すには、 execfile コマンドを使用します。 例:

以下を含むスクリプトを作成し、test1.py という名前を付けます。

[AIX Solaris HP-UX Linux Windows]
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
[z/OS]
execfile('/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')

以下を含むスクリプトを作成し、testFunctions.py という名前を付けます。

def printName(first, last):
   name = first + ' ' + last
   return name

次に、スクリプト引数として以下のパスを渡します。

[AIX Solaris HP-UX Linux Windows]
wsadmin -lang jython -f 'c:/temp/script/test1.py'
[z/OS]
wsadmin -lang jython -f '/temp/script/test1.py'

パス区切り文字にはスラッシュ (/) を使用する必要があります。 円記号 (&#xa5;) は 機能しません。

パッケージを使用する Jython スクリプトの実行

パッケージを使用するスクリプトを実行する場合は、パッケージを使用する Jython スクリプトの検索パスを wsadmin ツールに対して指定する必要があります。

この情報を wsadmin ツールに渡すには、wsadmin ツールの開始時に次のオプションを指定します。

-Dwsadmin.script.libraries.packages=path1;path2;...

ここで、dir1 および dir2 は、 Jython パッケージが含まれているライブラリーのディレクトリー検索パスを表します。

[Windows]

Microsoft Windows ディレクトリーを指定する Jython の使用

Jython は、次のリストにある文字または条件を特殊なものとして扱います。 Jython を使用する際は、可能な限り、これらの文字を使用しないようにしてください。

  • \a
  • \b
  • \f
  • \n
  • \N
  • \r
  • \t
  • \u
  • \U
  • \v
  • \x
  • 円記号 (&#xa5;) の後に 0 から 7 の数字のシーケンスが続くもの

Jython で Microsoft Windows のファイル・パスを指定するときには、 これらの特別な条件によく注意してください。 これらの文字ストリングを使用しなければならない場合には、 Jython によるこれらの特殊文字ストリングの解釈を回避するために、 1 つの円記号 (&#xa5;) の代わりに 2 つの円記号 (&#xa5;) を使用するか、1 つの円記号 (&#xa5;) をスラッシュに置き換えてください。 以下に、こうした調整方法の例を示します。

表 1. Jython ファイル・パスの指定 Windows ファイル・パスのディレクトリー分離文字には、 \\ または / を使用してください。
誤りのパス 二重の円記号 (&#xa5;) で修正したパス スラッシュで修正したパス
c:\aadirectory\myfile.txt c:\\aadirectory\\myfile.txt c:/aadirectory/myfile.txt
c:\myfiles\number1.txt c:\\myfiles\\number1.txt c:/myfiles/number1.txt
c:\zebra7\stripe.txt c:\zebra7\\stripe.txt c:/zebra7/stripe.txt
c:\5mod\Net33\residue.log c:\\fivemod\\Net33\\residue.log c:/fivemod/Net33/residue.log
問題の回避: 一般に、Jython でディレクトリー・パスを指定する際には、可能な限りスラッシュを使用してください。 スラッシュを使用すると、円記号 (&#xa5;) の使用に関する多くの問題を回避することができます。