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 ' de kullanımdan kaldırılan kitaplık modülleri

Bazı V2.1 kitaplık modülleri kullanımdan kaldırılmış ya da Jython V2.7için yeniden yazılmıştır. Bu nedenle, Jython V2.7 komut dosyanız bunları içe aktarıyorsa, bunun gibi bir 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 yok
V2.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.
Kullanımdan kaldırılan Jython kitaplığı modülleri:
  • dospath
  • gopherlib
  • javaos
  • jreload
  • reconvert
  • tzparse
  • whrandom

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.

custom.py , aşağıdaki gibi test.py çalıştırıldığında otomatik olarak yüklenir:
wsadmin -f c:/test.py
custom.py , c:\customscripts dizini gibi başka bir konuma yerleştirilirse, aşağıdaki gibi özel modülü içe aktarmak için -profile <profile_module> belirtmeniz gerekir:
wsadmin -profile c:/customscripts/custom.py -f c:/test.py
Farklı konumlarda bulunan birden çok modülü içe aktarmanız gerekirse, örneğin:
  • test1.py , profile_root/profile_name dizininde bulunur
  • test2.py , profile_root/ dizininde bulunur
Aşağıdaki gibi birden çok -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.py
Ya da python.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.

Örneğin, custom.py , wsadmin AdminConfig.list() komutunu çağıran print1()işlevini içeriyorsa:
def print1():
           print "I am custom"
           nodes = AdminConfig.list('Node')
           print "Nodes: " + nodes
test.pykomutunu çalıştırdığınızda şu hatayı alabilirsiniz:
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 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ı
Bu sorunu çözmek içinNameError, içe aktarma modülü komut dosyanızın (çağıran komut dosyasının değil) önüne aşağıdaki Jython komutlarını eklemeniz gerekir:
#custom.py:

import sys

# Retrieve scripting objects from system local name space 
AdminConfig = sys._getframe(1).f_locals['AdminConfig']
Komut dosyanız diğer 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: " + nodes

Dizgi 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.

Bu sorunu önlemek için wsadmin.bat dosyasını -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.

Bu anormalliğe iki çözüm mümkündür:
  1. 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.
  2. Komut dosyanızı olduğu gibi tutun (satır devam karakteriyle), ancak -useJython21 option dosyasını komut dosyasına ekleyin.
Bu koşula uyan bir komut dosyası örneğine bakın.
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
Aşağıdaki örnekte, test1 özel komut dosyası bir NameError hatası alır:
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ı
NameError hatasını çözmek için komut dosyası oluşturma nesnelerini özel komut dosyasına ekleyin:
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']
Özel bir komut dosyasını Jython V2.1 olarak çalıştırmak için -usejython21 seçeneğini kullanırsanız ve özel komut dosyası wsadmin komut dosyası kitaplıklarını çalıştırırsa, özel komut dosyasındaki komut dosyası nesnelerini açıklama satırı yapın. Komut dosyası kitaplıkları aşağıdaki örnekte açıklama satırı yapıldı:
$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

Özel komut dosyanız çalıştığında bir AttributeError hatasını önlemek için, 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'