Jython V2.7 での動作の変更
Jython V2.1 スクリプトを移植して Jython V2.7 を使用する場合に知っておく必要のあることについて説明します。
V2.7 では、Jython の動作が以下のように変更になっています。 作成したスクリプトが Jython V2.7 で正常に動作しない場合、提案されている以下の手順を使用してスクリプトを更新するか、引き続き古い Jython V2.1 を使用してください。
- Jython V2.7 で推奨されないライブラリー・モジュール
- String の動作の変更
- sys.exit() 関数に対する変更
- モジュールのインポートに関する変更
- ストリング例外を生成する方法
- 数値タイプに関する変更
Jython V2.7 で推奨されないライブラリー・モジュール
WASX7017E: ファイル "c:/test.py" の実行中に例外を受け取りました。例外情報: com.ibm.bsf.BSFException: Jython からの例外:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named jreload
V2.7 で利用可能な最新の Jython ライブラリー関数を使用するように Jython スクリプトを書き換える必要があります。
スクリプトを更新することが望ましくない場合は、引き続き古い Jython V2.1 を使用してください。- dospath
- gopherlib
- javaos
- jreload
- reconvert
- tzparse
- whrandom
javaos モジュールは、os に置き換えられました。 jreload の関数の大部分は、V2.7 の ihooks に含まれています。
String の動作の変更
V2.7 における String 処理の動作では、デフォルトの Unicode ストリング・タイプが使用されます。 これは WebSphere Application Server の既存の機能には影響しませんが、返されるストリングは、u'string のように、ストリング・リテラル u を前に付けた Jython Unicode ストリングとして表示されます。 次のようにしてユーザーは、print コマンドを指定して通常のストリングを表示するか、または str() コマンドを呼び出して Jython Unicode ストリングを通常のストリングに変換することができます。
AdminConfig.list('Node')
u'TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)\r\nTestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)'
# use print command to display regular string
print AdminConfig.list('Node')
TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)
TestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)
nodes = AdminConfig.list('Node')
u'TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)\r\nTestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)'
print nodes
TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)
TestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)
# Call str() command to convert unicode string to regular string
nodes = str(nodes)
nodes
'TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)\r\nTestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)'
sys.exit() 関数に対する変更
sys.exit() は SystemExit 例外を生成するため、SystemExit 例外をキャプチャーすることが予期されています。 v2.1 では SystemExit 例外を生成する必要はありませんが、v2.7 において SystemExit 例外をキャプチャーしない場合、SystemExit エラーでスクリプトが失敗することがあります。
この動作を例示するサンプル・コード test.py を参照してください。
test.py:
a = 5
b = 6
if (a > b):
print "a > b"
sys.exit(1)
else:
print " a < b"
sys.exit(0)
以下の例外が発生します。
WASX7017E: ファイル "c:/q.py" の実行中に例外を受け取りました。例外情報: com.ibm.bsf.BSFException: Jython からの例外:
Traceback (most recent call last):
File "<string>", line 12, in <module>
SystemExit: 0
この問題は、以下の解決方法うちいずれか 1 つを使用することにより回避できます。
- SystemExit 例外を生成しないようにするには、sys.exit() をコメント化してください。
- 例外をトリガーしないようにするには、sys.exit() ではなく os._exit() 関数を使用してください。
test.py: import os a = 5 b = 6 if (a > b): print "a > b" os._exit(1) else: print "a < b" os._exit(0)
- SystemExit エラーを検出して例外を生成するには、SystemExit 例外をキャプチャーします。
test.py: a = 5 b = 6 try: if (a > b): print "a > b" sys.exit(1) else: print "a < b" sys.exit(0) except SystemExit: print "sys.exit() worked as expected" except: print "Something went wrong"
モジュールのインポートに関する変更
Jython スクリプトでモジュールをインポートする必要がある場合、モジュールは wsadmin 作業ディレクトリーの中か、または別の場所に入れることができます。
以下に例を示します。
test.py には、以下の行が含まれています。
import custom
custom.py は、c:¥WebSphere¥AppServer¥profiles¥dmgr01¥bin など、wsadmin が実行される wsadmin 作業ディレクトリーの中に入れておくことができます。
wsadmin -f c:/test.py
wsadmin -profile c:/customscripts/custom.py -f c:/test.py
- test1.py は profile_root/profile_name ディレクトリーにある
- test2.py は profile_root/ ディレクトリーにある
wsadmin -profile <profile_root/profile_name/test1.py> -profile <profile_root/test2.py> -f c:/test.py
wsadmin.sh -lang jython -javaoption "-Dpython.path=<profile_root/profile_name>;< profile_root>" -f c:/test.py
インポート・モジュールから wsadmin の Admin コマンドが呼び出される場合、「NameError: グローバル名 'AdminConfig' が定義されていません」というエラー・メッセージを受け取ることがあります。 AdminControl、AdminApp、AdminTask、Help など、他の Admin オブジェクトに関してもエラー・メッセージが出る場合があります。 Jython 2.7 では、グローバル名前空間と Admin オブジェクトは、グローバル名前空間で登録されないようになったため、代わりにシステム・ローカル名前空間からそれを取り出す必要があります。
def print1():
print "I am custom"
nodes = AdminConfig.list('Node')
print "Nodes: " + nodes
WASX7017E: ファイル "c:/test.py" の実行中に例外を受け取りました。例外情報: com.ibm.bsf.BSFException: Jython からの例外:
Traceback (most recent call last):
File "<string>", line 15, in <module>
File "<string>", line 9, in print2
File "c:\custom.py", line 21, in print1
cell = AdminConfig.list('Cell')
NameError: global name 'AdminConfig' is not defined
#custom.py:
import sys
# Retrieve scripting objects from system local name space
AdminConfig = sys._getframe(1).f_locals['AdminConfig']
AdminApp = sys._getframe(1).f_locals['AdminApp']
AdminControl = sys._getframe(1).f_locals['AdminControl']
AdminTask = sys._getframe(1).f_locals['AdminTask']
Help = sys._getframe(1).f_locals['Help']
def print1():
print "I am custom"
nodes = AdminConfig.list('Node')
print "Nodes: " + nodes
ストリング例外を生成する方法
Jython V2.7 ではストリング例外を生成することができないため、ValueError、AttributeError、TypeError などの例外やエラーを生成するか、または Jython クラス内で独自のエラー・タイプを作成する必要があります。
以下に例を示します。
test.py:
nodeName = "testNode1"
if (nodeName != "testNode2"):
raise "Could not find node name '%s'" % (nodeName)
これは Jython 2.1 では動作しますが、Jython V2.7 では次の TypeError を受け取ることになります。
WASX7017E: ファイル "c:/p.py" の実行中に例外を受け取りました。例外情報: com.ibm.bsf.BSFException: Jython からの例外:
Traceback (most recent call last):
File "<string>", line 5, in <module>
TypeError: exceptions must be old-style classes or derived from BaseException, not str
例外または ValueError/TypeError/AttributeError を生成するには、スクリプトを書き直すことが必要です。
- 例外を生成する場合には次のようにします。
if (nodeName != "testNode2"): raise Exception("Could not find node name '%s'" % (nodeName))
- ValueError を生成する場合には次のようにします。
if (nodeName != "testNode2"): raise ValueError("Could not find node name '%s'" % (nodeName))
- Jython クラス内に独自のエラー・タイプを作成する場合には次のようにします。
class MyError(Exception): '''raise this when there's an error from my command''' if nodeName != "testNode2": raise MyError("Could not find node name '%s'" % (nodeName))
数値タイプに関する変更
Jython V2.1 では、numeric タイプは PyInteger や PyFloat などの Py オブジェクトであり、toString() などのメソッドが含まれていました。 Jython V2.7 の場合、numeric タイプは、native タイプに似たものとなっており、それらの基本的な Object メソッドは利用できません。 その違いは、Jython 関数に整数を渡し、toString() メソッドを使用してその値が出力された場合に明らかになります。
Jython V2.7 で次のサンプル・コードを使用する例を示します。
foo = 3.1415
print "foo =", foo.toString()
foo =
この結果として次のエラーが表示されます。
WASX7015E: コマンド実行中に例外が発生しました: ""foo =", foo.toString()"; 例外情報:
com.ibm.bsf.BSFException: Jython からの例外:
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'float' object has no attribute 'toString'
numeric タイプを表示するには、次のコマンドを使用できます。
print "foo = %f" % foo
foo = 3.141500