Verhaltensänderungen in Jython Version 2.7

Hier finden Sie wichtige Informationen, wenn Sie Jython-Scripts der Version 2.1 für die Verwendung mit Jython Version 2.7 portieren möchten.

Im Folgenden finden Sie bekannte Verhaltensänderungen in Jython Version 2.7. Falls Ihr Script unter Jython Version 2.7 nicht ordnungsgemäß ausgeführt wird, aktualisieren Sie es mithilfe der folgenden Vorschläge oder arbeiten Sie weiterhin mit Jython Version 2.1:

Veraltete Liberty-Module in Jython Version 2.7

Einige Liberty-Module der Version 2.1 werden nicht mehr unterstützt oder wurden für Jython Version 2.7 überarbeitet. Wenn diese von Ihrem Jython-Script der Version 2.7 importiert werden, wird eine Fehlermeldung vom Typ ImportError ähnlich der folgenden angezeigt:
WASX7017E: Beim Ausführen der Datei "c:/test.py" ist eine Ausnahme eingetreten. Informationen zur Ausnahme: com.ibm.bsf.BSFException: exception from Jython:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named jreload
Sie müssen Ihr Jython-Script überarbeiten, um die neuesten Jython-Bibliotheksfunktionen der Version 2.7 verwenden zu können. Falls Sie Ihr Script nicht aktualisieren möchten, verwenden Sie weiterhin Jython Version 2.1.
Veraltete Jython-Bibliotheksmodule:
  • dospath
  • gopherlib
  • javaos
  • jreload
  • reconvert
  • tzparse
  • whrandom

Das Modul javaos wurde durch os ersetzt. Die meisten Funktionen von jreload sind in Version 2.7 in ihooks enthalten.

Verhaltensänderungen der Zeichenfolge

Das Verarbeitungsverhalten für String verwendet in Version 2.7 Unicode als Standardzeichenfolgedatentyp. Dies hat keine Auswirkungen auf bestehende WebSphere Application Server-Funktionen, zeigt aber die zurückgegebene Zeichenfolge als Jython-Unicode-Zeichenfolge mit einem vorangestellten Zeichenfolgeliteral "u" an, z. B. u'string. Der Benutzer kann mit dem Befehl print die reguläre Zeichenfolge anzeigen oder mit dem Befehl str() Jython-Unicode-Zeichenfolgen in reguläre Zeichenfolgen umwandeln. Beispiel:

AdminConfig.list('Node')
	u'TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)\r\nTestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)'
        
       # Reguläre Zeichenfolge mit Befehl print anzeigen
	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)

       # Unicode-Zeichenfolge mit Befehl str() in reguläre Zeichenfolge umwandeln
	nodes = str(nodes)   
	nodes
	'TestCellManager(cells/TestCell/nodes/TestCellManager|node.xml#Node_1)\r\nTestNode(cells/TestCell/nodes/TestNode|node.xml#Node_1)'

Änderungen der Funktion sys.exit()

Die Funktion sys.exit() löst die Ausnahme SystemExit aus und soll diese abfangen. In Version 2.1 muss die Ausnahme SystemExit nicht ausgelöst werden, aber in Version 2.7 kann Ihr Script mit dem Fehler SystemExit fehlschlagen, wenn die Ausnahme SystemExit nicht abgefangen wird:

Im Beispielcode test.py wird dieses Verhalten veranschaulicht:

test.py: 

     a  = 5
     b = 6 
     
     if (a > b): 
          print "a > b" 
          sys.exit(1)
     else:
          print " a < b" 
          sys.exit(0)

Die folgende Ausnahme tritt auf:

WASX7017E: Beim Ausführen der Datei "c:/q.py" ist eine Ausnahme eingetreten. Informationen zur Ausnahme: com.ibm.bsf.BSFException: exception from Jython:
	Traceback (most recent call last):
           	File "<string>", line 12, in <module>
	SystemExit: 0

Das Problem kann mit einer der folgenden Lösungen vermieden werden:

  • Kommentieren Sie sys.exit() aus, wenn die Ausnahme SystemExit nicht ausgelöst werden soll.
  • Verwenden Sie die Funktion os._exit() statt sys.exit(), wenn Sie keine Ausnahme auslösen möchten.
    test.py:
    
          import os
          
          a  = 5
          b = 6 
          
          if (a > b): 
              print "a > b" 
              os._exit(1) 
          else:
              print "a < b" 
              os._exit(0)
  • Wenn Sie den Fehler SystemExit finden und eine Ausnahme auslösen möchten, fangen Sie die Ausnahme SystemExit ab.
    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"

Änderungen des Modulimports

Wenn Ihr Jython-Script ein Modul importieren soll, kann das Modul im Arbeitsverzeichnis von wsadmin oder an einer anderen Position gespeichert werden.

Beispiel:

test.py enthält die folgende Zeile:

import custom

custom.py kann im Arbeitsverzeichnis von wsadmin, z. B. c:\WebSphere\AppServer\profiles\dmgr01\bin gespeichert werden, in dem wsadmin ausgeführt wird.

custom.py wird automatisch geladen, wenn Sie test.py ausführen. Beispiel:
wsadmin -f c:/test.py
Wenn sich custom.py in einem anderen Verzeichnis als c:\customscripts befindet, müssen Sie -profile <Profilmodul> angeben, um das angepasste Modul zu importieren. Beispiel:
wsadmin -profile c:/customscripts/custom.py -f c:/test.py
Möglicherweise müssen Sie mehrere Module von verschiedenen Positionen importieren, zum Beispiel:
  • test1.py befindet sich im Verzeichnis Profilstammverzeichnis/Profilname
  • test2.py befindet sich im Verzeichnis Profilstammverzeichnis/
Sie können Module durch Befehle mit mehrfacher Angabe der Option -profile <Profilmodul> hinzufügen. Beispiel:
wsadmin -profile <Profilstammverzeichnis/Profilname/test1.py> -profile <Profilstammverzeichnis/test2.py> -f c:/test.py
Alternativ können Sie die Modulpfade über die Jython-Systemeigenschaft python.path hinzufügen. Die Pfade werden an die Eigenschaft python.path angehängt, wenn Jython geladen wird. Beispiel:
wsadmin.sh -lang jython -javaoption "-Dpython.path=<Profilstammverzeichnis/Profilname>;< Profilstammverzeichnis>" -f c:/test.py

Falls Ihr Importmodul wsadmin-Admin-Befehle aufruft, wird möglicherweise die Fehlernachricht NameError: global name 'AdminConfig' is not defined angezeigt. Es können auch andere Admin-Objekte beanstandet werden, z. B. AdminControl, AdminApp, AdminTask oder auch Help. Ab Jython Version 2.7 werden globale Namespace- und Admin-Objekte nicht mehr im globalen Namespace eingetragen. Sie müssen diese daher aus dem lokalen Namespace des Systems abrufen.

Wenn beispielsweise custom.py die Funktion print1() enthält, die den Befehl wsadmin AdminConfig.list() aufruft:
def print1():
           print "I am custom"
           nodes = AdminConfig.list('Node')
           print "Nodes: " + nodes
Wenn Sie test.py ausführen, wird möglicherweise der folgende Fehler angezeigt:
WASX7017E: Beim Ausführen der Datei "c:/test.py" ist eine Ausnahme eingetreten. Informationen zur Ausnahme: com.ibm.bsf.BSFException: exception from 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
Beheben Sie den Fehler NameError, indem Sie die folgenden Jython-Befehle vor Ihrem Importmodulscript (nicht dem aufrufenden Script) hinzufügen:
#custom.py:

import sys

# Scripting-Objekte vom lokalen Namespace des Systems abrufen
AdminConfig = sys._getframe(1).f_locals['AdminConfig']
Sie können weitere Admin-Objekte abrufen, wenn Ihr Script weitere Admin-Befehle aufruft:
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

Auslösen einer Zeichenfolgeausnahme

Jython Version 2.7 löst keine Zeichenfolgeausnahme aus, daher müssen Sie entweder eine Ausnahme oder einen Fehler des Typs ValueError, AttributeError oder TypeError auslösen, oder in einer Jython-Klasse Ihren eigenen Fehlertyp erstellen.

Beispiel:

test.py:

	nodeName = "testNode1"
	if (nodeName != "testNode2"):
     	      raise "Could not find node name '%s'" % (nodeName)

In Jython Version 2.1 ist das möglich, während in Jython Version 2.7 ein Fehler des Typs TypeError angezeigt wird.

WASX7017E: Beim Ausführen der Datei "c:/p.py" ist eine Ausnahme aufgetreten. Informationen zur Ausnahme: com.ibm.bsf.BSFException: exception from 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

Um eine Ausnahme oder einen Fehler vom Typ ValueError/TypeError/AttributeError auszulösen, müssen Sie Ihr Script überarbeiten.

  • Ausnahme auslösen:
    if (nodeName != "testNode2"):
              raise Exception("Could not find node name '%s'" % (nodeName))
  • ValueError auslösen:
    if (nodeName != "testNode2"):
              raise ValueError("Could not find node name '%s'" % (nodeName))
  • Erstellen Sie einen eigenen Fehlertyp in einer Jython-Klasse:
    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))

Änderungen des numerischen Typs

In Jython Version 2.1 waren numerische Typen Py-Objekte wie PyInteger oder PyFloat und haben als solche Methoden wie toString(). In Jython Version 2.7 gleichen numerische Typen mehr nativen Typen. Daher stehen ihnen diese grundlegenden Objektmethoden nicht zur Verfügung. Der Unterschied wird deutlich, wenn ein Integer an eine Jython-Funktion übergeben wird und sein Wert mit der Methode toString() ausgegeben wird.

Beispielcode in Jython Version 2.7:

foo = 3.1415
	print "foo =", foo.toString()  
	foo =

Der folgende Fehler tritt auf:

WASX7015E: Beim Ausführen des Befehls ""foo =", foo.toString()" ist eine Ausnahme eingetreten. Informationen zur Ausnahme:
	com.ibm.bsf.BSFException: exception from Jython:
	Traceback (most recent call last):
  	File "<input>", line 1, in <module>
	AttributeError: 'float' object has no attribute 'toString'

Mit dem folgenden Befehl können Sie den numerischen Typ anzeigen:

print "foo = %f" % foo
	foo = 3.141500

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rxml_jython27
Dateiname:rxml_jython27.html