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 関数のいずれかです。 例えば、以下の関数は、出力として「Hello, World!」を返します。
print "Hello, World!"
=> Hello, World!
import sys
sys.stdout.write("Hello World!¥n")
=> Hello, World!
例では、print は標準出力ストリームを示しています。 上記の例のように、 import ステートメントを実行することによって組み込みモジュールを使用することができます。 import ステートメントは、モジュール内のコードをインポートの一部として実行し、 モジュール・オブジェクトを戻します。 sys は、Python 言語の組み込みモジュールです。 Python 言語では、モジュールは名前空間であり、 そこでは名前が作成されます。 モジュール内に常駐する名前は属性と呼ばれます。 モジュールはファイルに対応しており、 Python 言語はモジュール・オブジェクトを作成して、 ファイル内に定義されたすべての名前を格納します。 すなわち、モジュールは名前空間です。


変数
オブジェクトを名前に割り当てるには、割り当てのターゲットを等号 (=) の左側に置き、割り当てるオブジェクトを右側に置きます。 左側のターゲットは名前またはオブジェクト・コンポーネントとなり、 右側のオブジェクトはオブジェクトを計算する任意の式となります。 オブジェクトを名前に割り当てる際には、以下の規則が存在します。
- 割り当てによって、オブジェクト参照が作成されます。
- 名前は、割り当てる際に作成されます。
- 名前は、参照する前に割り当てる必要があります。
変数名規則は、C 言語の規則に似ています。 例えば、変数名は、1 つの下線文字 (_) または文字に加えて、任意の数の文字、 数字、または下線を含むことができます。
- および
- assert
- break
- class
- continue
- def
- del
- elif
- else
- except
- exec
- finally
- for
- from
- global
- if
- import
- in
- is
- lambda
- not
- または
- pass
- raise
- return
- try
- while
以下に例を示します。
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)
円記号置換
ステートメントが複数行にまたがる必要がある場合は、前の行の末尾に円記号 (¥) を追加して、次の行に継続することを示すこともできます。 円記号の後ろには、空白文字、具体的にはタブまたはスペースを使用しないでください。 以下に例を示します。
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.
関数と有効範囲
- 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)
基本ステートメント
ループ・ステートメントには、while と for の 2 つがあります。条件ステートメントは if です。 エラー処理ステートメントは try です。 最後に、制御フローを微調整するステートメントには、 break、continue、および pass があります。
- if
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 ステートメント の例は以下のとおりです。
for target in object: statements else: statements
これは、シーケンス・オブジェクト内の項目を 1 つずつターゲットに割り当てて、 それぞれのループ本体を実行します。 ループ本体は通常、割り当てターゲットを使用して、 シーケンスをステップスルーしているカーソルのように、 シーケンス内の現在の項目を参照します。 以下に例を示します。
sum = 0 for x in [1, 2, 3, 4]: sum = sum + x
- break、continue、および pass
ループを break、continue、 および pass ステートメントで制御できます。 break ステートメントは、最も近い囲みループを飛び越します (ループ・ステートメント全体を越えて)。 continue ステートメントは、最も近い囲みループの先頭 (ループのヘッダー行に) にジャンプし、 pass ステートメントは空ステートメントのプレースホルダーです。
- try
ステートメントは、間違った数の引数を指定して呼び出された場合、 あるいはその実装に特定のエラー状態を検出した場合、 エラーを起こします。 キャッチされていないエラーは、スクリプトの実行を停止します。 try ステートメントは、そのようなエラーをトラップするために使用されます。Python の try ステートメントは、2 つの種類に分けられます。 一方は例外を処理し、他方は実行が行われるか否かに関係なく、 ファイナライズ・コードを実行します。try、except、else の各ステートメントは、 try ヘッダー行で始まり、その後ろに、インデントされたステートメントのブロック、 キャッチする例外を指定する 1 つ以上のオプションの except 文節、 および最後にオプションの else 文節が続きます。 try、finally ステートメントは、try ヘッダー行 で始まり、その後ろに、インデントされたステートメントのブロックがあり、次に、 その try ブロックの実行中に例外が発生したかどうかに関係なく終了前に必ず 実行される finally 文節が続きます。
try、except、else 関数の 例は以下のとおりです。
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...'
- ステートメントは、デフォルトでは順番に実行されます。ステートメントは通常、それが指定されている行の末尾で終了します。 ステートメントが長過ぎて、1 行に収まらない場合、 前の行の末尾に円記号 (¥) を追加して、 次の行に継続することを示すこともできます。
- ブロックおよびステートメントの境界は自動的に検出されます。 コードのブロックの周辺には、 中括弧や、開始または終了の区切り文字はありません。 その代わりに、Python 言語では、 ネストされたブロック内のステートメントをグループ化するため、 ヘッダーの下でステートメントのインデントを使用します。 ブロック境界は、行インデントによって検出されます。 同じ距離だけインデントされたステートメントはすべて、 より少なくインデントされた行によってそのブロックが終了されるまで、 同じブロックのコードに所属します。
- 複合ステートメントのパターン = ヘッダー ':' インデントされたステートメント。 Python 言語では、複合ステートメントはすべて、同じパターンに従います。 すなわち、ヘッダー行がコロンで終了し、 その後に、ヘッダーの下でインデントされた 1 つ以上のネストされたステートメントが続きます。 インデントされたステートメントは、ブロックと呼ばれます。
- スペースおよびコメントは通常、無視されます。 ステートメントおよび式の中のスペースは、 ほとんどすべての場合無視されます (ストリング定数およびインデント内を 除く)。コメントも同様です。
別のスクリプトによるスクリプトの呼び出し
Jython スクリプトを別の Jython スクリプトから呼び出すには、 execfile コマンドを使用します。以下に例を示します。
以下を含むスクリプトを作成し、test1.py という名前を付けます。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
![[z/OS]](../images/ngzos.gif)
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]](../images/dist.gif)
wsadmin -lang jython -f 'c:/temp/script/test1.py'
![[z/OS]](../images/ngzos.gif)
wsadmin -lang jython -f '/temp/script/test1.py'
パス区切り文字にはスラッシュ (/) を使用する必要があります。円記号 (¥) は 機能しません。
パッケージを使用する Jython スクリプトの実行
パッケージを使用するスクリプトを実行する場合は、パッケージを使用する Jython スクリプトの検索パスを wsadmin ツールに対して指定する必要があります。
この情報を wsadmin ツールに渡すには、wsadmin ツールの開始時に次のオプションを指定します。
-Dwsadmin.script.libraries.packages=path1;path2;...
ここで、dir1 および dir2 は、 Jython パッケージが含まれているライブラリーのディレクトリー検索パスを表します。
![[Windows]](../images/windows.gif)
Microsoft Windows ディレクトリーを指定する Jython の使用
Jython は、次のリストにある文字または条件を特殊なものとして扱います。 Jython を使用する際は、可能な限り、これらの文字を使用しないようにしてください。
- ¥a
- ¥b
- ¥f
- ¥n
- ¥N
- ¥r
- ¥t
- ¥u
- ¥U
- ¥v
- ¥x
- 円記号 (¥) の後に 0 から 7 の数字のシーケンスが続くもの
Jython で Microsoft Windows のファイル・パスを指定するときには、 これらの特別な条件によく注意してください。これらの文字ストリングを使用しなければならない場合には、 Jython によるこれらの特殊文字ストリングの解釈を回避するために、 1 つの円記号 (¥) の代わりに 2 つの円記号 (¥) を使用するか、1 つの円記号 (¥) をスラッシュに置き換えてください。 以下に、こうした調整方法の例を示します。
誤りのパス | 二重の円記号 (¥) で修正したパス | スラッシュで修正したパス |
---|---|---|
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 |
