將 wsadmin Scripting 與 Jython 搭配使用

Jython 是 Python的替代實作,完全以 Java™撰寫。

wsadmin 工具使用 Jython V2.7。 下列資訊是 Jython 語法的基本摘要。 在所有範例程式碼中,行首的 => 表示法代表指令或函數輸出。

如需其他 Jython V2.7 特定資訊,請參閱 Jython V2.7 行為變更

如果需要 Jython V2.1 ,則必須使用下列其中一個方法來明確配置它:

  • 使用 wsadmin 指令指定 Jython V2.1 :
    wsadmin -conntype soap -usejython21 true -f test.py
  • 使用 wsadmin.properties 檔中的自訂內容來指定 Jython V2.1 :
    com.ibm.ws.scripting.usejython21=true

    預設值為 false。

附註: Jython 二進位檔隨附於 WebSphere Application Server 9.0版中的 Jython 程式庫模組。 不過,如果您遇到任何 Jython 程式庫模組的問題,我們不會提供任何技術支援。 若為任何 Jython 技術問題,請將問題張貼至 Jython 專案

基本功能

此函數是內建函數或 Jython 函數的名稱。 例如,下列函數會傳回 "Hello , World!" 作為輸出:

print "Hello, World!"
=>Hello, World!

import sys
sys.stdout.write("Hello World!\n")
=>Hello, World!

在此範例中, print 識別標準輸出串流。 您可以執行 import 陳述式 (如前述範例) 來使用內建模組。 陳述式匯入會在模組中執行程式碼作為匯入的一部分,並傳回模組物件。 sys 是 Python 語言的內建模組。 在 Python 語言中,模組是用來建立名稱的名稱空間。 位於模組中的名稱稱為屬性。 模組對應於檔案,且 Python 語言會建立模組物件,以包含檔案中定義的所有名稱。 換句話說,模組是名稱空間。

避免麻煩: 當您在 wsadmin Script 中發出 Jython 指令,以呼叫 WebSphere Application Server MBean 作業時, MBean 方法會傳回包含一些 NLS 翻譯字元 (例如法文重音字元) 的字串, Jython 會自動將字串轉換為 Python Unicode 字串,並將轉換後的字串傳回給 wsadmin。 如果您在呼叫 MBean 方法的 Script 中包含 Jython 列印輸出指令,則 MBean 方法傳回給 wsadmin 的字串中會包含 NLS 翻譯字元,而不是 Python Unicode 值。 若要避免顯示 NLS 翻譯字元,請對 MBean 傳回使用變數 (例如 output = AdminControl.invoke(mbean)) ,然後使用列印輸出。 使用 Jython 列印指令,可以正確轉換包含 NLS 翻譯字元的字串。
避免麻煩: 當您在 wsadmin Script 中發出 Jython 指令來呼叫 WebSphere Application Server MBean 作業,且 MBean 方法會傳回包含一些 NLS 轉換字元 (例如法文重音字元) 的字串時, Jython 會自動將字串轉換成 Python Unicode 字串,並將轉換後的字串傳回給 wsadmin。 如果您在呼叫 MBean 方法的 Script 中包含 Jython print output 指令,則 NLS 轉換字元會併入 MBean 方法傳回至 wsadmin 的字串中,而非 Python Unicode 值。 如果要避免顯示 NLS 轉換字元,請使用 MBean 傳回的變數 (例如 output = AdminControl.invoke(mbean)) ,然後使用 print output。 使用 Jython print 指令來正確地轉換包含 NLS 轉換字元的字串。

變數

若要將物件指派給名稱,指派的目標會在等號 (=) 的第一端,以及您在另一端指派的物件。 第一端的目標可以是名稱或物件元件,另一端的物件可以是計算物件的任意表示式。 下列規則適用於將物件指派給名稱:

  • 指派會建立物件參照。
  • 當您指派名稱時,會建立名稱。
  • 您必須先指派名稱,然後再參照它。

變數名稱規則類似於 C 語言的規則; 例如,變數名稱可以具有底線字元 (_) 或字母加上任意數目的字母、數字或底線。

下列保留字不能用於變數名稱:
  • 主張
  • break
  • 類別
  • 繼續
  • DEF
  • 德爾
  • 埃利斯
  • else
  • 除了
  • EXEC
  • 終於
  • 如需
  • 廣域 (global)
  • 假設
  • import
  • IN
  • lambda
  • pass
  • print
  • 提高
  • 返回
  • try
  • 取代為
  • 屈服

例如:

a  = 5
print a
=> 5

b =  a
print b
=> 5

text1, text2, text3, text4  = 'good', 'bad', 'pretty', 'ugly'
print text3
=> pretty

第二個範例將變數 a 的值指派給變數 b。

類型和運算子

下列清單包含內建物件類型的範例:

  • 數字 例如:
    8, 3.133,  999L,  3+4j
    
    num1 = int(10)
    print num1
    => 10
  • 弦 例如:
    'name',  "name's", ''
    
    print str(12345)
    => '12345'
  • 清單。 例如:
    x = [1, [2,  'free'], 5]
    y = [0, 1, 2, 3]
    y.append(5)
    print y
    => [0, 1, 2, 3, 5]
    
    y.reverse()
    print y
    => [5, 3, 2, 1, 0]
    
    y.sort()
    print y
    => [0, 1, 2, 3, 5]
    
    print list("apple")
    => ['a', 'p', 'p', 'l', 'e']
    
    print list((1,2,3,4,5))
    => [1, 2, 3, 4, 5]
    
    test = "This is a test"
    test.index("test")
    => 10
    
    test.index('s')
    => 3

下列清單包含運算子的範例:

  • x 或 y

    僅當 x 為 false 時才會評估 y。 例如:

    print 0 or 1
    => 1
  • x 和 y

    只有在 x 為 true 時才會評估 y。 例如:

    print 0 and 1
    =>  0
  • x + y , x-y

    加法和連結,減法。 例如:

    print  6 + 7
    => 13
    
    text1 = 'Something'
    text2 = ' else'
    print text1 + text2
    => Something else
    
    list1 = [0, 1, 2, 3]
    list2 = [4, 5, 6, 7]
    print list1 + list2
    => [0, 1, 2, 3, 4, 5, 6, 7]
    
    print  10 - 5
    => 5
  • x * y , x/y , x% y

    乘法和重複、除法、餘數和格式。 例如:

    print 5 * 6
    => 30
    
    print 'test' * 3
    => test test test
    
    print 30 / 6
    => 5
    
    print 32 % 6
    => 2
  • x [i] , x [i:j] , x (...)

    檢索、切割、函數呼叫。 例如:

    test = "This is a test"
    print  test[3]
    => s 
    
    print test[3:10]
    => s is a
    
    print test[5:]
    => is a test
    
    print test[:-4]
    => This is a 
    
    print len(test)
    => 14
    
  • <, <=, >, >=, ==, <>, !=, is is not

    比較運算子、身分測試。 例如:

    L1 = [1, ('a', 3)]
    L2 = [1, ('a', 2)]
    L1 < L2, L1 == L2, L1 > L2, L1 <> L2, L1 != L2, L1 is L2, L1 is not L2
    => (0, 0, 1, 1, 1, 0, 1)

反斜線替代

如果陳述式必須跨越多行,您也可以在前一行的結尾新增反斜線 (\) ,以指出您將繼續下一行。 請勿在反斜線字元之後使用空格字元,特別是 Tab 或空格。 例如:

text =  "This is a test of a long lines" \
" continuing lines here."
print text
=> This is a test of a long lines continuing lines here.

功能和範圍

Jython 使用 def 陳述式來定義函數。 功能相關陳述包括:
  • def, return

    def 陳述式會建立函數 object ,並將它指派給名稱。 return 陳述式會將結果物件傳回給呼叫程式。 這是選用項目,如果不存在,則函數會結束,以便控制流程脫離函數主體。

  • global

    global 陳述式宣告要指派的模組層次變數。 依預設,在函數中指派的所有名稱都是該函數的本端名稱,且只有在函數執行時才存在。 如果要在含括模組中指派名稱,請列出廣域陳述式中的函數。

定義函數的基本語法如下:

def name (arg1, arg2, ... ArgN)
   statements
   return value

其中 name 是所定義函數的名稱。 後面接著左括弧、右括弧及冒號。 括弧內的引數包括程序的參數清單。 冒號後面的下一行是函數的主體。 形成函數主體的指令群組。 定義 Jython 函數之後,就會像任何內建函數一樣使用它。 例如:

def intersect(seq1, seq2):
   res = []
   try:
      for x in seq1:
         if x in seq2:
            res.append(x)
   except:
      pass
   return res

若要呼叫此函數,請使用下列指令:

s1 = "SPAM"
s2 = "SCAM"
intersect(s1, s2)
=> [S, A, M]

intersect([1,2,3], (1.4)) 
=> [1]

註解

在 Jython 語言中使用井號字元 (#) 進行註解。

指令行引數

Jython Shell 會將指令行引數傳遞至 Script ,以作為 sys.argv的值。 在 wsadmin Jython 中,程式或 Script 的名稱不是 sys.argv的一部分。 與 wsadmin Jython 不同, Jython 獨立式會將 Script 檔作為 Script 的起始引數。 因為 sys.argv 是陣列,所以請使用 index 指令從引數清單中擷取項目。 例如, test.py 採用三個引數 a、b 及 c。

wsadmin -f test.py  a  b  c

test.py 內容:

import sys
first  =  sys.argv[0]
second = sys.argv[1]
third = sys.argv[2]
arglen = len(sys.argv)

基本陳述式

有兩個迴圈陳述式: whilefor。 條件式陳述式為 if。 錯誤處理陳述式為 try。 最後,有一些陳述式可細部調整控制流程: breakcontinuepass

假設

if 陳述式會選取要執行的動作。 if 陳述式可能包含其他陳述式,包括其他 if 陳述式。 if 陳述式後面可以接著一或多個選用的 elif 陳述式,並以選用的 else 區塊結尾。

if 的一般格式如下:

if test1
   statements1
elif test2
   statements2
else
   statements3

例如:

weather = 'sunny'
if weather == 'sunny':
   print "Nice weather"
elif weather == 'raining':
   print "Bad weather"
else:
   print "Uncertain, don't plan anything"

while 陳述式由具有測試表示式的標頭行、一個以上縮排陳述式的主體,以及在控制項結束迴圈而不進入 break 陳述式時執行的選用 else 陳述式所組成。 只要標頭行中的測試繼續評估 true 值, while 陳述式就會反覆地執行縮排陳述式的區塊。 while 的範例如下:

while test1
   statements1
else
   statements2

例如:

a = 0; b = 10
while a < b:
   print a
   a = a + 1
如需

for 陳述式以標頭行開頭,該標頭行指定一或多個指派目標,以及您要逐步執行的物件。 標頭後面接著您要重複的縮排陳述式區塊。

for 陳述式的範例如下:

for target in object:
   statements
else:
   statements

它會逐一將序列物件中的項目指派給目標,並針對每一個項目執行迴圈主體。 迴圈主體通常使用指派目標來參照序列中的現行項目,就像游標逐步執行序列一樣。 例如:

sum = 0
for x in [1, 2, 3, 4]:
   sum = sum + x
break、continue 及 pass

您可以使用 breakcontinuepass 陳述式來控制迴圈。 break 陳述式會跳出最接近的含括迴圈 (超出整個迴圈陳述式)。 continue 陳述式會跳至最接近之含括迴圈的開頭 (跳至迴圈的標頭行) ,而 pass 陳述式是空的陳述式位置保留元。

try

如果以錯誤的引數數目呼叫陳述式,或它偵測到其實作特有的某個錯誤狀況,則陳述式會產生錯誤。 未處理的錯誤會停止執行 Script。 try 陳述式用來設陷這類錯誤。 Python try 陳述式有兩個特性,一個用來處理異常狀況,另一個用來執行最終化程式碼 (不論是否發生異常狀況)。 tryexceptelse 陳述式以一個 try 標頭行開頭,後面接著一個縮排陳述式的區塊,然後接著一或多個選用的除外條款,用來命名要捕捉的異常狀況,最後是選用的 else 子句。 tryfinally 陳述式以 try 標頭行開頭,後面接著縮排陳述式的區塊,然後是 finally 子句,不論在 try 區塊執行時是否發生異常狀況,一律會在輸出路上執行。

tryexceptelse 函數的範例如下:

try:
   statements
except name:
   statements
except name, data:
   statements
else
   statements

例如:

try: myfunction () except: import sys print 'uncaught' , sys.exc_info() try: myfilereader () except EOFError: break else: process next line here

try 及 finally 的一般格式如下所示:

try
   statements
finally
   statements

例如:

def divide(x, y):
   return x / y

def tester(y):
   try:
      print divide(8, y)
   finally:
      print 'on the way out...'
下列是 Python中的語法規則清單:
  • 依預設,陳述式會循序執行。 陳述式通常會在其出現行的結尾結束。 當陳述式太長而無法填滿單一行時,您也可以在前一行的結尾新增反斜線 (\) ,以指出您要繼續下一行。
  • 會自動偵測區塊及陳述式界限。 程式碼區塊周圍沒有大括弧或開始或結束定界字元。 相反地, Python 語言會使用標頭下陳述式的縮排,以將陳述式分組在巢狀區塊中。 行縮排會偵測區塊界限。 所有縮排相同距離的陳述式都屬於相同的程式碼區塊,直到該區塊以無縮排行結束為止。
  • 複合陳述式 = 標頭; ':' ,縮排陳述式。 Python 語言中的所有複合陳述式都遵循相同的型樣: 以冒號結尾的標頭行,後面接著一個以上縮排在標頭下的巢狀陳述式。 縮排陳述式稱為區塊。
  • 通常會忽略空格和註解。 陳述式和表示式內的空格幾乎一律會被忽略 (字串常數和縮排除外) ,註解也會被忽略。

使用另一個 Script 來呼叫 Script

使用 execfile 指令,從另一個 Jython Script 呼叫 Jython Script。 例如:

建立稱為 test1.py 的 Script ,其中包含下列各項:

[AIX Solaris HP-UX Linux Windows]
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')

建立稱為 testFunctions.py 的 Script ,其中包含下列各項:

def printName(first, last):
   name = first + ' ' + last
   return name

然後傳遞下列路徑作為 Script 引數:

[AIX Solaris HP-UX Linux Windows]
wsadmin -lang jython -f 'c:/temp/script/test1.py'

您必須使用正斜線 (/) 作為路徑分隔字元。 反斜線 (\) 無法運作。

執行使用套件的 Jython Script

如果您執行使用套件的 Script ,則必須為 wsadmin 工具提供使用套件之 Jython Script 的搜尋路徑。

如果要將這項資訊提供給 wsadmin 工具,當您啟動工具時,請包含下列選項:

-Dwsadmin.script.libraries.packages=path1;path2;...

其中 dir1dir2 代表包含 Jython 套件之程式庫的目錄搜尋路徑。

[Windows]

搭配 Microsoft Windows 目錄的 Jython 用法

Jython 會將下列字元或條件清單視為特殊。 若可能的話,在使用 Jython 時,請勿使用這些字元。

  • \a
  • \b
  • \f
  • \n
  • \N
  • \r
  • \t
  • \u
  • \U
  • \v
  • \x
  • 反斜線後面接著 0 到 7 之間的一連串數字

在 Jython 中指定 Microsoft Windows 檔案路徑時,您必須瞭解這些特殊條件。 當您必須使用任何這些字串時,您可以使用「兩個反斜線」而非一個反斜線,或以正斜線取代單一反斜線,來抵消這些特殊字串的 Jython 解譯。 下列範例說明如何進行這些調整。

表 1. Jython 檔案路徑規格 在 Windows 檔案路徑中使用 \\/ 作為目錄分隔字元。
錯誤路徑 已更正雙反斜線路徑 已更正正斜線路徑
c:\aadirectory\myfile.txt c:\\aadirectory\\myfile.txt c:/aadirectory/myfile.txt
c:\myfiles\number1.txt c:\\myfiles\\number1.txt c:/myfiles/number1.txt
c:\zebra7\stripe.txt c:\zebra7\\stripe.txt c:/zebra7/stripe.txt
c:\5mod\Net33\residue.log c:\\fivemod\\Net33\\residue.log c:/fivemod/Net33/residue.log
避免麻煩: 一般而言,在指定 Jython 中的目錄路徑時,請儘可能嘗試使用正斜線。 正斜線可避免許多與使用反斜線相關聯的問題。