將 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 函數的名稱。 例如,下列函數會傳回 "Hello , World!" 作為輸出:
print "Hello, World!"
=>Hello, World!
import sys
sys.stdout.write("Hello World!\n")
=>Hello, World!
在此範例中, print 識別標準輸出串流。 您可以執行 import 陳述式 (如前述範例) 來使用內建模組。 陳述式匯入會在模組中執行程式碼作為匯入的一部分,並傳回模組物件。 sys 是 Python 語言的內建模組。 在 Python 語言中,模組是用來建立名稱的名稱空間。 位於模組中的名稱稱為屬性。 模組對應於檔案,且 Python 語言會建立模組物件,以包含檔案中定義的所有名稱。 換句話說,模組是名稱空間。
MBean 作業時, MBean 方法會傳回包含一些 NLS 翻譯字元 (例如法文重音字元) 的字串, Jython 會自動將字串轉換為 Python Unicode 字串,並將轉換後的字串傳回給 wsadmin。 如果您在呼叫 MBean 方法的 Script 中包含 Jython 列印輸出指令,則 MBean 方法傳回給 wsadmin 的字串中會包含 NLS 翻譯字元,而不是 Python Unicode 值。 若要避免顯示 NLS 翻譯字元,請對 MBean 傳回使用變數 (例如 output = AdminControl.invoke(mbean)) ,然後使用列印輸出。 使用 Jython 列印指令,可以正確轉換包含 NLS 翻譯字元的字串。output =
AdminControl.invoke(mbean)) ,然後使用 print output。 使用 Jython print 指令來正確地轉換包含 NLS 轉換字元的字串。變數
若要將物件指派給名稱,指派的目標會在等號 (=) 的第一端,以及您在另一端指派的物件。 第一端的目標可以是名稱或物件元件,另一端的物件可以是計算物件的任意表示式。 下列規則適用於將物件指派給名稱:
- 指派會建立物件參照。
- 當您指派名稱時,會建立名稱。
- 您必須先指派名稱,然後再參照它。
變數名稱規則類似於 C 語言的規則; 例如,變數名稱可以具有底線字元 (_) 或字母加上任意數目的字母、數字或底線。
- 和
- 如
- 主張
- break
- 類別
- 繼續
- DEF
- 德爾
- 埃利斯
- else
- 除了
- EXEC
- 終於
- 如需
- 從
- 廣域 (global)
- 假設
- import
- IN
- 是
- lambda
- 不
- 或
- pass
- 提高
- 返回
- 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.
功能和範圍
def 陳述式來定義函數。 功能相關陳述包括:def,returndef陳述式會建立函數object,並將它指派給名稱。return陳述式會將結果物件傳回給呼叫程式。 這是選用項目,如果不存在,則函數會結束,以便控制流程脫離函數主體。globalglobal陳述式宣告要指派的模組層次變數。 依預設,在函數中指派的所有名稱都是該函數的本端名稱,且只有在函數執行時才存在。 如果要在含括模組中指派名稱,請列出廣域陳述式中的函數。
定義函數的基本語法如下:
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)
基本陳述式
有兩個迴圈陳述式: while 和 for。 條件式陳述式為 if。 錯誤處理陳述式為 try。 最後,有一些陳述式可細部調整控制流程: break、 continue及 pass。
- 假設
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
您可以使用
break、continue及pass陳述式來控制迴圈。break陳述式會跳出最接近的含括迴圈 (超出整個迴圈陳述式)。continue陳述式會跳至最接近之含括迴圈的開頭 (跳至迴圈的標頭行) ,而pass陳述式是空的陳述式位置保留元。- try
如果以錯誤的引數數目呼叫陳述式,或它偵測到其實作特有的某個錯誤狀況,則陳述式會產生錯誤。 未處理的錯誤會停止執行 Script。
try陳述式用來設陷這類錯誤。 Pythontry陳述式有兩個特性,一個用來處理異常狀況,另一個用來執行最終化程式碼 (不論是否發生異常狀況)。try、except、else陳述式以一個 try 標頭行開頭,後面接著一個縮排陳述式的區塊,然後接著一或多個選用的除外條款,用來命名要捕捉的異常狀況,最後是選用的else子句。try,finally陳述式以 try 標頭行開頭,後面接著縮排陳述式的區塊,然後是 finally 子句,不論在 try 區塊執行時是否發生異常狀況,一律會在輸出路上執行。try、except、else函數的範例如下: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 語言中的所有複合陳述式都遵循相同的型樣: 以冒號結尾的標頭行,後面接著一個以上縮排在標頭下的巢狀陳述式。 縮排陳述式稱為區塊。
- 通常會忽略空格和註解。 陳述式和表示式內的空格幾乎一律會被忽略 (字串常數和縮排除外) ,註解也會被忽略。
使用另一個 Script 來呼叫 Script
使用 execfile 指令,從另一個 Jython Script 呼叫 Jython Script。 例如:
建立稱為 test1.py 的 Script ,其中包含下列各項:
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
建立稱為 testFunctions.py 的 Script ,其中包含下列各項:
def printName(first, last):
name = first + ' ' + last
return name
然後傳遞下列路徑作為 Script 引數:
wsadmin -lang jython -f 'c:/temp/script/test1.py'
您必須使用正斜線 (/) 作為路徑分隔字元。 反斜線 (\) 無法運作。
執行使用套件的 Jython Script
如果您執行使用套件的 Script ,則必須為 wsadmin 工具提供使用套件之 Jython Script 的搜尋路徑。
如果要將這項資訊提供給 wsadmin 工具,當您啟動工具時,請包含下列選項:
-Dwsadmin.script.libraries.packages=path1;path2;...
其中 dir1 和 dir2 代表包含 Jython 套件之程式庫的目錄搜尋路徑。
搭配 Microsoft Windows 目錄的 Jython 用法
Jython 會將下列字元或條件清單視為特殊。 若可能的話,在使用 Jython 時,請勿使用這些字元。
- \a
- \b
- \f
- \n
- \N
- \r
- \t
- \u
- \U
- \v
- \x
- 反斜線後面接著 0 到 7 之間的一連串數字
在 Jython 中指定 Microsoft Windows 檔案路徑時,您必須瞭解這些特殊條件。 當您必須使用任何這些字串時,您可以使用「兩個反斜線」而非一個反斜線,或以正斜線取代單一反斜線,來抵消這些特殊字串的 Jython 解譯。 下列範例說明如何進行這些調整。
| 錯誤路徑 | 已更正雙反斜線路徑 | 已更正正斜線路徑 |
|---|---|---|
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 |