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
- Verhaltensänderungen der Zeichenfolge
- Änderungen der Funktion sys.exit()
- Änderungen des Modulimports
- Auslösen einer Zeichenfolgeausnahme
- Änderungen des numerischen Typs
Veraltete Liberty-Module in Jython Version 2.7
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.- 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.
wsadmin -f c:/test.py
wsadmin -profile c:/customscripts/custom.py -f c:/test.py
- test1.py befindet sich im Verzeichnis Profilstammverzeichnis/Profilname
- test2.py befindet sich im Verzeichnis Profilstammverzeichnis/
wsadmin -profile <Profilstammverzeichnis/Profilname/test1.py> -profile <Profilstammverzeichnis/test2.py> -f c:/test.py
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.
def print1():
print "I am custom"
nodes = AdminConfig.list('Node')
print "Nodes: " + nodes
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
#custom.py:
import sys
# Scripting-Objekte vom lokalen Namespace des Systems abrufen
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
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