和 Jython 一起使用 wsadmin 脚本编制
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 语言创建模块对象以包含文件中定义的所有名称。换句话说,模块就是名称空间。


变量
要对名称指定对象,指定目标位于等号 (=) 左侧,要指定的对象位于等号右侧。左侧的目标可以是名称或对象组件,右侧的对象可以是计算对象的任意表达式。以下是将对象赋值给名称的规则:
- 赋值创建对象引用。
- 对名称赋值时创建它们。
- 在引用名称之前必须指定该名称。
变量名称规则与 C 语言的规则相似;例如,变量名称可以具有下划线字符 (_) 或字母,再加上任意数目的字母、数字或下划线。
- and
- assert
- break
- class
- continue
- def
- del
- elif
- else
- except
- exec
- finally
- for
- from
- global
- if
- import
- in
- is
- lambda
- not
- or
- pass
- raise
- return
- try
- while
例如:
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 or y
仅当 x 为 false 时对 y 求值。例如:
print 0 or 1 => 1
- x and 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)
反斜杠替换
如果一个语句必须占用多行,那么也可以在前一行的末尾添加反斜杠 (\) 以表明将在下一行继续输入该语句。请勿在反斜杠字符后面使用空格字符(具体来说就是制表符或空格)。例如:
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 和 return
def 语句创建函数 object 并将其赋值给名称。return 语句将结果对象发送回调用者。这是可选的,如果它不存在,那么函数将退出,以便控制流减小函数体。
- global
global 语句声明要赋值的模块级变量。缺省情况下,函数中赋值的所有名称对于该函数是本地的,并且仅当函数运行时存在。要对封装模块的名称赋值,请在 global 语句中列出函数。
定义函数的基本语法如下:
def name (arg1, arg2, ... ArgN)
statements
return value
其中 name 是正在定义的函数名。它后面接着是左括号、右括号和冒号。括号内的参数包括给过程的参数列表。冒号后面的下一行是函数体。一组命令形成函数体。一旦您定义了 Jython 函数,就会像使用任何内置函数一样使用该 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 将命令行参数作为 sys.argv 的值传递给脚本。在 wsadmin Jython 中,程序或脚本名称不是 sys.argv 中的部分。与 wsadmin Jython 不同,独立的 Jython 将脚本文件作为脚本的初始自变量。因此 sys.argv 是一个数组,使用索引命令抽取参数列表中的项。例如,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 语句。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
while 语句由具有测试表达式的头行、一个或多个缩进语句组成的主体以及可选的 else 语句组成,该语句在控件退出循环而没有运行到中断语句时运行。只要头行中的 test 持续求值为 true,while 语句就会反复运行缩进语句块。下面是 while 语句的一个示例:
while test1 statements1 else statements2
例如:
a = 0; b = 10 while a < b: print a a = a + 1
- for
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
如果用错误数量的参数调用语句,或者如果语句检测到特定于其实现的某些错误条件时,它会产生错误。未捕获的错误会导致停止运行脚本。try 语句用来捕获这样的错误。Python try 语句以两种形式出现,一种用于处理异常,另一种用于运行最终化代码(无论是否发生异常)。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 exception', 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 语言中的所有复合语句遵循同一模式:头行以冒号结束,后跟在头下缩进的一个或多个嵌套语句。缩进语句称为块。
- 通常忽略空格和注释。几乎总是忽略语句和表达式中的空格(除非在字符串常量和缩进中),注释也是如此。
使用一个脚本调用其他脚本
请使用 execfile 命令来从一个 Jython 脚本调用另一个 Jython 脚本。例如:
创建包含以下内容的称为 test1.py 的脚本:
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
![[z/OS]](../images/ngzos.gif)
execfile('/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
创建包含以下内容的称为 testFunctions.py 的脚本:
def printName(first, last):
name = first + ' ' + last
return name
然后,请将以下路径作为脚本参数进行传递:
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
wsadmin -lang jython -f 'c:/temp/script/test1.py'
![[z/OS]](../images/ngzos.gif)
wsadmin -lang jython -f '/temp/script/test1.py'
必须将正斜杠 (/) 用作路径分隔符。反斜杠 (\) 不起作用。
运行使用包的 Jython 脚本
如果您运行使用包的脚本,那么必须为 wsadmin 工具提供将使用包的 Jython 脚本的搜索路径。
要为 wsadmin 工具提供此信息,请在启动该工具时包括以下选项:
-Dwsadmin.script.libraries.packages=path1;path2;...
其中 dir1 和 dir2 表示包含 Jython 包的库的目录搜索路径。
![[Windows]](../images/windows.gif)
对 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 |
