Jython 与 CPython - sys 模块参数解析
Jython vs CPython - sys module argument parsing
在编写用于 WebLogic 脚本工具 (12.1.3) 的部署脚本时,我遇到了 Python 2.2.1 和 Jython 2.2.1 之间的这种不一致。如果您将命令行参数传递给每个参数,它们将被不同地解析,正如这个测试程序所指出的:
$ cat pytest.py
import sys
print sys.argv
当 运行 时,这是每个解释器的结果。
CPython 2.2.1:
$ /cygdrive/c/Python22/python.exe pytest.py a b 'c,d,e'
['pytest.py', 'a', 'b', 'c,d,e']
Jython 2.2.1:
$ /cygdrive/c/jython2.2.1/jython.bat pytest.py a b 'c,d,e'
['pytest.py', 'a', 'b', 'c', 'd', 'e']
我使用 Jython 2.2.1 的原因是因为它是 WLST 使用的 Python 实现,所以我不相信我可以升级到更高版本或使用 CPython 解释器来规避我用例中的问题。
这是一个错误吗? Jython 的解析似乎违反直觉。有没有办法在 Jython 中以 CPython 方式解析参数?提前致谢。
jython.bat 的内容(包含在 Jython 安装中):
$ cat jython.bat
@echo off
rem This file was generated by the Jython installer
rem Created on Mon Oct 31 13:19:59 PDT 2016 by smcgloth
set ARGS=
:loop
if [%1] == [] goto end
set ARGS=%ARGS% %1
shift
goto loop
:end
"C:\Program Files\Java\jre1.8.0_101\bin\java.exe" -Dpython.home="C:\jython2.2.1" -classpath "C:\jython2.2.1\jython.jar;%CLASSPATH%" org.python.util.jython %ARGS%
今天早上我和我的团队讨论了这个问题,我们已经弄清楚为什么我在 Linux 环境中遇到这个问题,所以我想我会 post 一个答案以防万一帮助别人。我的一位队友为我忽略的 WLST 编写了一个启动脚本:
$ cat wlst
#!/bin/sh
wlst.sh -skipWLSModuleScanning $@
在我的案例中,罪魁祸首是 -skipWLSModuleScanning
标志。来自 the documentation:
Use this option to reduce startup time by skipping package scanning and caching for WebLogic Server modules.
似乎跳过包扫描必须跳过一些影响 Jython 解析命令行参数的方式的关键内容。
以下是跳过 WLS 模块扫描时的结果:
$ wlst ~/pytest.py a b 'c,d,e'
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
['pytest.py', 'a', 'b', 'c', 'd', 'e']
这里是标准 wlst.sh 调用的结果,这是我期望的结果:
$ wlst.sh ~/pytest.py a b 'c,d,e'
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
['/home/tdmsadm/pytest.py', 'a', 'b', 'c,d,e']
在编写用于 WebLogic 脚本工具 (12.1.3) 的部署脚本时,我遇到了 Python 2.2.1 和 Jython 2.2.1 之间的这种不一致。如果您将命令行参数传递给每个参数,它们将被不同地解析,正如这个测试程序所指出的:
$ cat pytest.py
import sys
print sys.argv
当 运行 时,这是每个解释器的结果。
CPython 2.2.1:
$ /cygdrive/c/Python22/python.exe pytest.py a b 'c,d,e'
['pytest.py', 'a', 'b', 'c,d,e']
Jython 2.2.1:
$ /cygdrive/c/jython2.2.1/jython.bat pytest.py a b 'c,d,e'
['pytest.py', 'a', 'b', 'c', 'd', 'e']
我使用 Jython 2.2.1 的原因是因为它是 WLST 使用的 Python 实现,所以我不相信我可以升级到更高版本或使用 CPython 解释器来规避我用例中的问题。
这是一个错误吗? Jython 的解析似乎违反直觉。有没有办法在 Jython 中以 CPython 方式解析参数?提前致谢。
jython.bat 的内容(包含在 Jython 安装中):
$ cat jython.bat
@echo off
rem This file was generated by the Jython installer
rem Created on Mon Oct 31 13:19:59 PDT 2016 by smcgloth
set ARGS=
:loop
if [%1] == [] goto end
set ARGS=%ARGS% %1
shift
goto loop
:end
"C:\Program Files\Java\jre1.8.0_101\bin\java.exe" -Dpython.home="C:\jython2.2.1" -classpath "C:\jython2.2.1\jython.jar;%CLASSPATH%" org.python.util.jython %ARGS%
今天早上我和我的团队讨论了这个问题,我们已经弄清楚为什么我在 Linux 环境中遇到这个问题,所以我想我会 post 一个答案以防万一帮助别人。我的一位队友为我忽略的 WLST 编写了一个启动脚本:
$ cat wlst
#!/bin/sh
wlst.sh -skipWLSModuleScanning $@
在我的案例中,罪魁祸首是 -skipWLSModuleScanning
标志。来自 the documentation:
Use this option to reduce startup time by skipping package scanning and caching for WebLogic Server modules.
似乎跳过包扫描必须跳过一些影响 Jython 解析命令行参数的方式的关键内容。
以下是跳过 WLS 模块扫描时的结果:
$ wlst ~/pytest.py a b 'c,d,e'
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
['pytest.py', 'a', 'b', 'c', 'd', 'e']
这里是标准 wlst.sh 调用的结果,这是我期望的结果:
$ wlst.sh ~/pytest.py a b 'c,d,e'
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
['/home/tdmsadm/pytest.py', 'a', 'b', 'c,d,e']