Jython V2.7 での動作の変更

Jython V2.1 スクリプトを移植して Jython V2.7 を使用する場合に知っておく必要のあることについて説明します。

V2.7 では、Jython の動作が以下のように変更になっています。 作成したスクリプトが Jython V2.7 で正常に動作しない場合、提案されている以下の手順を使用してスクリプトを更新するか、引き続き古い Jython V2.1 を使用してください。

Jython V2.7 で推奨されないライブラリー・モジュール

一部の V2.1 ライブラリー・モジュールは、非推奨となったか、または Jython V2.7 用に書き直されました。 そのため、Jython V2.7 スクリプトでそれらをインポートすると、次のような ImportError を受け取ります。
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 を使用してください。
非推奨の Jython ライブラリー・モジュールを以下に示します。
  • 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 作業ディレクトリーの中に入れておくことができます。

custom.py は、次のようにして test.py を実行する際に自動的にロードされます。
wsadmin -f c:/test.py
custom.pyc:¥customscripts ディレクトリーなどの他の場所にある場合、次のようにして -profile <profile_module> を指定することにより、カスタム・モジュールをインポートする必要があります。
wsadmin -profile c:/customscripts/custom.py -f c:/test.py
異なる複数の場所にある複数のモジュールをインポートする必要がある場合には以下のようにします。例えば次の例を考えます。
  • test1.pyprofile_root/profile_name ディレクトリーにある
  • test2.pyprofile_root/ ディレクトリーにある
この場合、次のようにして複数の -profile <profile_module> コマンドを使ってモジュールを追加できます。
wsadmin -profile <profile_root/profile_name/test1.py> -profile <profile_root/test2.py> -f c:/test.py
あるいは、次のように Jython のシステム・プロパティー python.path を使ってモジュールのパスを追加することもできます。 それらのパスは、Jython のロード時にプロパティー python.path に追加されます。
wsadmin.sh -lang jython -javaoption "-Dpython.path=<profile_root/profile_name>;< profile_root>" -f c:/test.py

インポート・モジュールから wsadminAdmin コマンドが呼び出される場合、「NameError: グローバル名 'AdminConfig' が定義されていません」というエラー・メッセージを受け取ることがあります。 AdminControlAdminAppAdminTaskHelp など、他の Admin オブジェクトに関してもエラー・メッセージが出る場合があります。 Jython 2.7 では、グローバル名前空間と Admin オブジェクトは、グローバル名前空間で登録されないようになったため、代わりにシステム・ローカル名前空間からそれを取り出す必要があります。

例えば、custom.py に関数 print1() が含まれていて、そこから次のように wsadmin AdminConfig.list() コマンドが呼び出されるとします。
def print1():
           print "I am custom"
           nodes = AdminConfig.list('Node')
           print "Nodes: " + nodes
この場合、test.py を実行すると、次のエラーを受け取ることがあります。
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
NameError を解決するには、呼び出しスクリプトではなく、モジュール・インポート・スクリプトの前に次の Jython コマンドを追加する必要があります。
#custom.py:

import sys

# Retrieve scripting objects from system local name space 
AdminConfig = sys._getframe(1).f_locals['AdminConfig']
スクリプトで Admin の他のコマンドを呼び出す場合、Admin の他のオブジェクトも取得する必要があります。
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 ではストリング例外を生成することができないため、ValueErrorAttributeErrorTypeError などの例外やエラーを生成するか、または 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 タイプは PyIntegerPyFloat などの 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

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rxml_jython27
ファイル名:rxml_jython27.html