Jython V2.7 davranış değişiklikleri
Jython V2.1 komut dosyalarını Jython V2.7kullanacak şekilde taşırken bilmeniz gerekenleri keşfedin.
Aşağıdakiler, V2.7sürümünde bilinen Jython davranış değişiklikleridir. Komut dosyanız Jython V2.7ile düzgün çalışmıyorsa, aşağıdaki önerileri kullanarak komut dosyanızı güncelleyin ya da daha eski Jython V2.1:
- Jython V2.7
- Dizgi davranışı değişiklikleri
- sys.exit() işlevinde yapılan değişiklikler
- Modüllerin içe aktarılmasında yapılan değişiklikler
- Dizgi kural dışı durumu nasıl yapılır
- Sayısal tip değişiklikleri
- Windows işletim sisteminde İngilizce olmayan ülke değeri
- -useJython21 seçeneğinin kullanılması
- Komut dosyası nesneleri için ad alanında yapılan değişiklikler
- test.py adlı özel komut dosyasına izin verilmiyor
Jython V2.7 ' de kullanımdan kaldırılan kitaplık modülleri
ImportError alırsınız:WASX7017E: "c:/test.py" dosyası çalıştırılırken kural dışı durum alındı; kural dışı durum bilgileri: com.ibm.bsf.BSFException: Jython 'dan kural dışı durum: Geri izleme (en son arama): Dosya "< dizgi>", satır 1, < modülü> ImportError: jreload adlı bir modül yokV2.7 'de bulunan en son Jython kitaplığı işlevlerini kullanmak için Jython komut dosyanızı yeniden yazmanız ya da komut dosyanızı güncellemek istemiyorsanız daha eski Jython V2.1 ' i kullanmaya devam etmeniz gerekir.
dospathgopherlibjavaosjreloadreconverttzparsewhrandom
javaos modülü osile değiştirildi. jreload işlevlerinin çoğu, V2.7içindeki ihooks içinde bulunur.
Dizgi davranışı değişiklikleri
String işleme davranışı, V2.7' de varsayılan bir Unicode dizgi tipini kullanır. Var olan uygulama sunucusu işlevlerini etkilemez, ancak döndürülen dizgiyi, dizginin başına u dizgi hazır bilgisi eklenmiş olarak Jython Unicode dizgisi olarak görüntüler. Örneğin, normal string öğesini Unicode u'stringolarak döndürür. wsadmin komutu için değişken olarak döndürülen dizgi değerini kullandığınızda, dizgi değerinin Unicode dizgisi içermediğini doğrulayın. Dizgi değeri Unicode dizgisi içeriyorsa, val1 komutunu wsadmin komutuna geçirmeden önce str(va1) komutunu kullanın. Olağan dizgiyi görüntülemek için print komutunu belirtebilirsiniz. Diğer bir seçenek olarak, Jython Unicode dizgisini aşağıdaki gibi olağan bir dizgiye dönüştürmek için str() komutunu çağırabilirsiniz:
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() işlevinde yapılan değişiklikler
sys.exit() ,SystemExitkural dışı durum, bu nedenleSystemExitkural dışı durum. Bu,SystemExitv2.1' de kural dışı durum oluştu, ancak komut dosyanızSystemExitşu hatayı yakalamadıysanızSystemExitv2.7:
Şu davranışı gösteren test.pyörnek koduna bakın:
test.py:
a = 5
b = 6
if (a > b):
print "a > b"
sys.exit(1)
else:
print " a < b"
sys.exit(0)
Şu kural dışı durum oluştu:
WASX7017E: "c:/q.py" dosyası çalıştırılırken kural dışı durum alındı; kural dışı durum bilgileri: com.ibm.bsf.BSFException: Jython 'dan kural dışı durum:
Geri izleme (en son arama):
Dosya "< dizgi>", satır 12, < modülü>
SystemExit: 0
Aşağıdaki çözümlerden herhangi biri kullanılarak sorun önlenebilir:
- Şu satırı kaldırmak istemiyorsanız
sys.exit()satırını açıklama satırı yapın:SystemExitkural dışı durum. - Bunun yerine
os._exit()işlevini kullanınsys.exit()Eğer bir kural dışı durumu tetiklemek istemiyorsanız.test.py: import os a = 5 b = 6 if (a > b): print "a > b" os._exit(1) else: print "a < b" os._exit(0) - ŞuSystemExitözel durumu saptamak istiyorsanızSystemExithata ve bir kural dışı durum oluştur.
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"
Modülleri içe aktarırken yapılan değişiklikler
Jython komut dosyanızın bir modülü içe aktarması gerekiyorsa, modül wsadmin çalışma dizinine yerleştirilebilir ya da başka bir konuma yerleştirilebilir.
Örneğin:
test.py aşağıdaki satırı içerir:
import custom
custom.py , c:\WebSphere\AppServer\profiles\dmgr01\bin gibi wsadmin çalışma dizinine yerleştirilebilir; burada wsadmin çalıştırılır.
wsadmin -f c:/test.py-profile
<profile_module> belirtmeniz gerekir:wsadmin -profile c:/customscripts/custom.py -f c:/test.py- test1.py , profile_root/profile_name dizininde bulunur
- test2.py , profile_root/ dizininde bulunur
-profile <profile_module> komutu aracılığıyla modül ekleyebilirsiniz:wsadmin -profile <profile_root/profile_name/test1.py> -profile <profile_root/test2.py> -f c:/test.pypython.path Jython sistem özelliği aracılığıyla modül yolunu ekleyebilirsiniz ve Jython yüklendiğinde python.path özelliğine yollar eklenir:wsadmin.sh -lang jython -javaoption "-Dpython.path=<profile_root/profile_name>;< profile_root>" -f c:/test.pyİçe aktarma modülünüz wsadmin Admin komutlarını çağırırsa,NameError: global name 'AdminConfig' is
not definedhata iletisi. AdminControl, AdminApp, AdminTaskya da Help gibi diğer Admin nesnelerinden de şikayetçi olabilir. Jython 2.7ile Admin nesneleri artık genel ad alanına kaydedilmez; bu nedenle, bunu sistem yerel ad alanından almanız gerekir.
print1()işlevini içeriyorsa:def print1():
print "I am custom"
nodes = AdminConfig.list('Node')
print "Nodes: " + nodesWASX7017E: "c:/test.py" dosyası çalıştırılırken kural dışı durum alındı; kural dışı durum bilgileri: com.ibm.bsf.BSFException: Jython 'dan kural dışı durum:
Geri izleme (en son arama):
Dosya "< dizgi>", satır 15, < modülü>
Dosya "< string>", satır 9, print2 içinde
Dosya "c:\custom.py", satır 21, print1 içinde
cell = AdminConfig.list ('Hücre')
NameError: 'AdminConfig' genel adı tanımlanmadı
#custom.py:
import sys
# Retrieve scripting objects from system local name space
AdminConfig = sys._getframe(1).f_locals['AdminConfig']Admin komutlarını çağırırsa, diğer Admin nesnelerini de alabilirsiniz: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: " + nodesDizgi kural dışı durumu nasıl yapılır?
Jython V2.7 dizgi kural dışı durumu yaratılmasına izin vermediği için, bir kural dışı durum ya da hata vermeniz gerekir;ValueError,AttributeError,TypeErrorYa da bir Jython sınıfında kendi hata tipinizi yaratın.
Örneğin:
test.py:
nodeName = "testNode1"
if (nodeName != "testNode2"):
raise "Could not find node name '%s'" % (nodeName)
Jython 2.1ile çalışır, ancak aşağıdaki bilgileri alırsınız:TypeErrorJython V2.7:
WASX7017E: "c:/p.py" dosyası çalıştırılırken kural dışı durum alındı; kural dışı durum bilgileri: com.ibm.bsf.BSFException: Jython 'dan kural dışı durum:
Geri izleme (en son arama):
Dosya "< dizgi>", satır 5, < modülü>
TypeError: Kural dışı durumlar str değil, eski stil sınıflar ya da BaseException' dan türetilmiş olmalıdır
Kural dışı durum olarak ya daValueError/TypeError/AttributeError.
- Kural dışı durum oluştur:
if (nodeName != "testNode2"): raise Exception("Could not find node name '%s'" % (nodeName)) - YükseltValueError:
if (nodeName != "testNode2"): raise ValueError("Could not find node name '%s'" % (nodeName)) - Jython sınıfında kendi hata tipinizi yaratın:
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))
Sayısal tip değişiklikleri
Jython V2.1' de, numeric tipleri PyInteger ya da PyFloat gibi Py nesnelerdi ve toString()gibi yöntemler vardı. Jython V2.7' de numeric tipleri daha çok native tiplerine benzer ve bu temel Object yöntemleri yoktur. Fark, bir tamsayı bir Jython işlevine geçirildiğinde ve değeri toString() yöntemi kullanılarak yazdırıldığında keşfedildi.
Jython V2.7' de şu örnek kodu kullanarak:
foo = 3.1415
print "foo =", foo.toString()
foo =
Şu hatayla sonuçlanır:
WASX7015E: Komut çalıştırılırken kural dışı durum oluştu: "" foo = ", foo.toString()"; kural dışı durum bilgileri: com.ibm.bsf.BSFException: Jython 'dan kural dışı durum: Geri izleme (en son arama): Dosya "< giriş>", satır 1, < modülü> içinde AttributeError: 'float 'nesnesinin özniteliği yok'toString'
numeric tipini görüntülemek için aşağıdaki komutu kullanabilirsiniz:
print "foo = %f" % foo
foo = 3.141500
Windows işletim sisteminde İngilizce olmayan ülke değeri
Bir Windows™ işletim sisteminde Jython V2.7 kullandığınızda, kodlamanın nasıl işlendiği nedeniyle Unicode karakterlerin işlenmesi etkilenir. Jython V2.7 davranışı UTF-8 kodlamasını varsayar. UNIX ® işletim sisteminde, karakterlerin işlenmesi ve görüntülenmesi doğrudur. Windows işletim sistemi için, Windows komut konsolu UTF-8 ' i desteklemediği ve Unicode karakterlerini yanlış yorumladığı için, Jython V2.7 işlemi Windows komut isteminde karakterlerin görüntülenmesini bozar.
-Dfile.encoding=UTF-8 deyimini ekleyecek şekilde güncelleyin. Aşağıdaki örnek, bu komut dosyası ayarlamasını göstermektedir.%JAVA_EXE% -Dfile.encoding=UTF-8
-Djava.ext.dirs="%WAS_JAVA_EXT_DIRS%"
-Djava.endorsed.dirs="%WAS_ENDORSED_DIRS%"
-Dcmd.properties.file=%TMPJAVAPROPFILE% %PERFJAVAOPTION%
%WAS_LOGGING% %CONSOLE_ENCODING%
%WAS_DEBUG% "%CLIENTSOAP%"
"%JAASSOAP%" "%CLIENTSAS%"
"%CLIENTSSL%"
%WSADMIN_PROPERTIES_PROP%
%WORKSPACE_PROPERTIES% "
-Duser.install.root=%USER_INSTALL_ROOT%"
"-Dwas.install.root=%WAS_HOME%
" %javaoption%
com.ibm.wsspi.bootstrap.WSPreLauncher -nosplash -application
com.ibm.ws.bootstrap.WSLauncher
com.ibm.ws.admin.services.WsAdmin %*-useJython21 seçeneğinin kullanılması
"\" satır devamlılığı karakteriyle uygulanan Jython komut dosyaları WebSphere Application Server Sürüm 8.0 ve Sürüm 8.5.5 üzerinde düzgün yürütülür, ancak Sürüm 9.0üzerinde yürütülemez. Sürüm 9.0için bu aynı komut dosyaları bir com.ibm.bsf.BSFException: exception
from Jython: "no viable alternative at input"..ile başarısız olur.
- Devam karakterini kaldırın ve komut dosyasını uzun tek bir satıra dizin. Bu yaklaşım, Jython27kullanılarak V9.0 için çalışır.
- Komut dosyanızı olduğu gibi tutun (satır devam karakteriyle), ancak -useJython21 option dosyasını komut dosyasına ekleyin.
def updateEAR(input_appName, input_appname_path,
input_MapModulesToServers):
#print "input_appName : " + input_appName
#print "input_appname_path : " + input_appname_path
#print "input_MapModulesToServers : " +
input_MapModulesToServers
AdminApp.update(input_appName, \
'app',
'[ -operation update \
-contents ' + input_appname_path + ' \
-nopreCompileJSPs \
-distributeApp \
-nouseMetaDataFromBinary \
-nodeployejb \
-createMBeansForResources \
....Komut dosyası nesneleri için ad alanında yapılan değişiklikler
Jython 2.7için, komut dosyası oluşturma nesneleri genel ad alanına kaydedilmek yerine sistem yerel ad alanından alınır. Komut dosyası oluşturma nesneleri: AdminApp, AdminConfig, AdminTask, AdminControlve Help.
Özel bir komut dosyasını komut dosyası kitaplığına aktardığınızda, özel komut dosyası wsadmin AdminUtilities ve Micromanagement gibi komut dosyası kitaplıklarını çalıştırırsa, özel komut dosyası bir NameError hatası alabilir. wsadmin komut dosyası kitaplıkları, sistem yerel ad alanında belirtilmeyen komut dosyası nesnelerini kullandığında hata oluşur. Aşağıdaki örnek, test1 özel komut dosyasıdır:
test1.py: (invoke AdminUtilities script library function)
import AdminUtilities,AdminClusterManagement,AdminServerManagement
bundleName = "com.ibm.ws.scripting.resources.scriptLibraryMessage"
resourceBundle = AdminUtilities.getResourceBundle(bundleName)
# 1: Remove Cell Custom Property
def disableAdminAuthCache(cellName):
try:
# Get a handle to the JVM object...
AdminUtilities.infoNotice("Cell name supplied to disableAdminAuthCache: " + cellName)
propertyId = AdminConfig.getid("/Cell:"+cellName+"/Property:enableAdminAuthorizationCache/")
AdminUtilities.infoNotice("Property to remove is: " + propertyId)
# Get the current args set
if (propertyId != ""):
AdminConfig.remove(propertyId)
AdminUtilities.infoNotice("enableAdminAuthorizationCache property is now removed")
except:
AdminUtilities.infoNotice("There was an issue removing the enableAdminAuthorizationCache property")
raise
#endTry
#endDef
D:\WebSphere\AppServer\profiles\Dmgr01\bin>wsadmin -conntype none -javaoption "-Dwsadmin.script.libraries= c: \testscript" -c "test1.disableAdminAuthCache('abc')"
WASX7357I: By request, this scripting client is not connected to any server process. Certain configuration and application operations will be available in local mode.
WASX7015E: Komut çalıştırılırken kural dışı durum oluştu: "test1.disableAdminAuthCache('abc')"; kural dışı durum bilgileri:
com.ibm.bsf.BSFException: Jython 'dan kural dışı durum:
Geri izleme (en son arama):
Dosya "< giriş>", satır 1, < modülü> içinde
NameError: ad 'test1' tanımlanmadı
import sys
# Retrieve scripting objects from 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']$WAS_HOME/scriptLibraries/servers/V70/AdminServerManagement.py
# Retrieve scripting objects from 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']test.py adlı özel komut dosyasına izin verilmez
test terimi Jython kitaplık modüllerinde kullanıldığından test.py özel komut dosyasını adlandırmayın. Aşağıdaki örnek, AttributeError hatasını göstermektedir:D:\WebSphere\AppServer\profiles\Dmgr01\bin>wsadmin -conntype none -javaoption "-Dwsadmin.script.libraries= c: \testscript" -c "test.disableAdminAuthCache('abc ')"
WASX7357I: By request, this scripting client is not connected to any server process. Certain configuration and application operations will be available in local mode.
WASX7015E: Komut çalıştırılırken kural dışı durum oluştu: "test.disableAdminAuthCache('AMYLIN8Cell43')"; kural dışı durum bilgileri:
com.ibm.bsf.BSFException: Jython 'dan kural dışı durum:
Geri izleme (en son arama):
Dosya "< giriş>", satır 1, < modülü> içinde
AttributeError: 'module 'nesnesinin özniteliği yok'disableAdminAuthCache'