和 Jython 一起使用 wsadmin 脚本编制

Jython 是 Python 的备用实现,它完全采用 Java™ 编写。

wsadmin 工具使用 Jython V2.7。以下信息是 Jython 语法的基本摘要。在所有样本代码中,行首的 => 符号表示法表示命令或函数输出。

有关 Jython V2.7 其他特定信息,请参阅Jython V2.7 行为更改

如果需要 Jython V2.1,那么必须使用下列其中一种方法显式地对其进行配置:

注: Jython 库模块随 WebSphere Application Server V9.0 中的 Jython 二进制文件一起提供。但是,当您遇到与任何 Jython 库模块相关的问题时,我们不会提供任何技术支持。对于任何 Jython 技术问题,请将问题提交给 Jython Project

基本函数

该函数是内置函数或 Jython 函数的名称。例如,以下函数输出“Hello, World!”:

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

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

在此示例中,print 识别标准输出流。您可以通过运行 import 语句来使用内置模块,如前面的示例。该语句导入将模块中的代码作为导入的一部分运行,并返回模块对象。sys 是 Python 语言的内置模块。在 Python 语言中,模块是名称空间,它是创建名称的位置。驻留在模块中的名称称为属性。模块与文件相对应,且 Python 语言创建模块对象以包含文件中定义的所有名称。换句话说,模块就是名称空间。

避免故障 避免故障: 当在调用 WebSphere Application Server MBean 操作的 wsadmin 脚本中发出 Jython 命令,且 MBean 方法返回的字符串包含 NLS 已翻译的字符(如法文重音字符)时,Jython 会自动将该字符串转换为 Python Unicode 字符串并将已转换的字符串返回给 wsadmin。如果将 Jython print output 命令包括在调用 MBean 方法的脚本中,那么将在 MBean 方法返回给 wsadmin 的字符串中包括 NLS 翻译的字符,而不是 Python Unicode 值。要避免显示 NLS 转换字符,请使用变量来表示 MBean 回车符(例如 output = AdminControl.invoke(mbean)),然后使用 print output。使用 Jython print 命令来正确地转换包含 NLS 转换字符的字符串。gotcha
避免故障 避免故障: 如果在调用 WebSphere Application Server MBean 操作的 wsadmin 脚本中发出 Jython 命令,并且 MBean 方法返回了一个其中包含一些 NLS 翻译的字符(例如法语重音字符)的字符串,那么 Jython 会自动将此字符串转换为 Python Unicode 字符串,并将转换后的字符串返回给 wsadmin。如果将 Jython print output 命令包括在调用 MBean 方法的脚本中,那么将在 MBean 方法返回给 wsadmin 的字符串中包括 NLS 翻译的字符,而不是 Python Unicode 值。为了避免显示 NLS 翻译的字符,请使用 MBean return 的变量(例如,output = AdminControl.invoke(mbean)),然后使用 print output。 使用 Jython print 命令来正确地转换包含 NLS 翻译的字符的字符串。gotcha

变量

要对名称指定对象,指定目标位于等号 (=) 左侧,要指定的对象位于等号右侧。左侧的目标可以是名称或对象组件,右侧的对象可以是计算对象的任意表达式。以下是将对象赋值给名称的规则:

  • 赋值创建对象引用。
  • 对名称赋值时创建它们。
  • 在引用名称之前必须指定该名称。

变量名称规则与 C 语言的规则相似;例如,变量名称可以具有下划线字符 (_) 或字母,再加上任意数目的字母、数字或下划线。

不能将下列保留字用于变量名称:
  • and
  • assert
  • break
  • class
  • continue
  • def
  • del
  • elif
  • else
  • except
  • exec
  • finally
  • for
  • from
  • global
  • if
  • import
  • in
  • is
  • lambda
  • not
  • or
  • pass
  • print
  • 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.

函数和范围

Jython 使用 def 语句来定义函数。与函数相关的语句包括:
  • defreturn

    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)

基本语句

有两个循环语句:whilefor。条件语句是 if。错误处理语句是 try。最后,有一些语句可以用来微调控制流:breakcontinuepass

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

可以使用 breakcontinuepass 语句控制循环。break 语句跳出最近的闭循环(经过整个循环语句)。continue 语句跳转到最近的闭循环开头(到循环的头行),而 pass 语句是个空语句占位符。

try

如果用错误数量的参数调用语句,或者如果语句检测到特定于其实现的某些错误条件时,它会产生错误。未捕获的错误会导致停止运行脚本。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 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 语言在头下使用缩进语句以对嵌套块中的语句进行分组。通过行缩进检测块边界。缩进相同距离的所有语句属于同一代码块,直到该块由缩进较少的一行结束。
  • 复合语句 = 头;“:”、缩进语句。Python 语言中的所有复合语句遵循同一模式:头行以冒号结束,后跟在头下缩进的一个或多个嵌套语句。缩进语句称为块。
  • 通常忽略空格和注释。几乎总是忽略语句和表达式中的空格(除非在字符串常量和缩进中),注释也是如此。

使用一个脚本调用其他脚本

请使用 execfile 命令来从一个 Jython 脚本调用另一个 Jython 脚本。例如:

创建包含以下内容的称为 test1.py 的脚本:

[AIX Solaris HP-UX Linux Windows]
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')
[z/OS]
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]
wsadmin -lang jython -f 'c:/temp/script/test1.py'
[z/OS]
wsadmin -lang jython -f '/temp/script/test1.py'

必须将正斜杠 (/) 用作路径分隔符。反斜杠 (\) 不起作用。

运行使用包的 Jython 脚本

如果您运行使用包的脚本,那么必须为 wsadmin 工具提供将使用包的 Jython 脚本的搜索路径。

要为 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 中可以使用正斜杠来指定目录路径的情况下,请尽量使用正斜杠。 使用正斜杠可以避免与使用反斜杠相关的许多问题。gotcha

指示主题类型的图标 概念主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cxml_jython
文件名:cxml_jython.html