Hen*_*ndy 4 python linux command-line lotus-notes jython
更新/解决方案:答案如下,来自Zack.确实,问题是脚本文件本身的DOS行结尾,clenotes.cmd.由于我对各种文件非常了解,我删除了整个目录,然后从HERE重新下载了一份新的副本.我在文件上运行了Zack的perl脚本,就像这样:
perl -pi.bak -e 's/[ \t\r]+$//' clenotes.cmd
Run Code Online (Sandbox Code Playgroud)
然后我稍微编辑了命令执行,以便最终脚本变为:
CWD=`dirname $0`
JYTHON_HOME="$CWD"
LIB_DIR="$JYTHON_HOME/lib"
NOTES_HOME="/opt/ibm/lotus/notes/"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NOTES_HOME
java -cp "$LIB_DIR" -jar "$LIB_DIR/jython.jar" -Djython.home="$CWD/" -Dpython.path="$LIB_DIR:$CWD/ext" -Djava.library.path="$NOTES_HOME" "$LIB_DIR/clenotes/cletes/clenotes.py" "$@"
Run Code Online (Sandbox Code Playgroud)
就是这样 - 其他一切都奏效了.不需要对clenotes.py或clenotes.cfg进行编辑.非常感谢你坚持这个问题,我觉得这个问题很简单.
更新:我正在减少一些代码,使其更具可读性并从帖子中删除不必要的信息.
我正在尝试让Lotus Notes命令行在 Linux上运行,并且在python文件中遇到与sys.argv [1:]相关的问题.Windows脚本在这里:
@echo off
@setlocal
set CWD=%~dp0
set JYTHON_HOME=%CWD%
set LIB_DIR=%JYTHON_HOME%/lib
java -cp %LIB_DIR% -jar %LIB_DIR%/jython.jar -Djython.home=%CWD% -python.path=%LIB_DIR%;%CWD%/ext %LIB_DIR%/clenotes/clenotes.py %*
@endlocal
Run Code Online (Sandbox Code Playgroud)
我在变量方面遇到了困难,所以对于Linux来说,它看起来像这样:
java -cp ./lib/ -jar ./lib/jython.jar -Djython.home=./ -Dpython.path=./lib:./ext -Djava.library.path=/opt/ibm/lotus/notes/ ./lib/clenotes/clenotes.py $*
Run Code Online (Sandbox Code Playgroud)
我在目录中运行它.无论如何,让我感到困惑的是它没有从命令行中获取任何选项.clenotes.cmd --help
结果是
No commands specified. Use --help option for usage.
Run Code Online (Sandbox Code Playgroud)
以下是应该解析命令行参数的部分:
def main():
Output.log("Entering %s v%s" % (PROGRAM_NAME,VERSION),Output.LOGTYPE_DEBUG)
cliOptions2=[]
for opt in cliOptions:
opt2=opt.replace('--','')
opt2=opt2.replace('!','=')
cliOptions2.append(opt2)
opts=[]
args=[]
try:
opts, args = getopt.getopt(sys.argv[1:], '', cliOptions2)
Run Code Online (Sandbox Code Playgroud)
我在32位chroot环境中使用Arch Linux 64bit上的Python 3.1.3.我还能提供别的吗?
以防万一需要...... HERE是整个clenotes.py文件.
此外,根据评论中的要求,配置文件(包含帮助消息和可行的选项/参数)在此处
更新
经过大量的摆弄,我所取得的最好进展是在(主)方法中检查它的设置为opts和args.最令人惊讶的是,当传递一个参数然后使用时查看它的解析结果时print sys.argv
,该选项会在其中产生一个尾随\r
.例如:
clenotes.cmd appointments
args is ['appointments\r']
Run Code Online (Sandbox Code Playgroud)
在Windows上我做了同样的事情并报告了args ['appointments']
.此外,手动设置args=['appointments']
然后注释掉getopt.getopt
分配值的部分.
最后,我发现当使用多个参数时,n-1被解释并被使用,而第n个被忽略.这是一种解决方法,因为我实际上可以使用脚本......但显然它不是首选.如果我想看今天的约会,我可以执行clenotes.cmd appointments --today --today
,它会工作.sys.argv
将吐出:['appointments', '--today', '--today\r']
.
那么......导致尾随的原因是\r
什么?我认为这与实际的脚本有关.再说一遍:
java -cp ./lib/ -jar ./lib/jython.jar -Djython.home=./ -Dpython.path=./lib:./ext -Djava.library.path=/opt/ibm/lotus/notes/ ./lib/clenotes/clenotes.py $*
Run Code Online (Sandbox Code Playgroud)
所以...一堆路径的东西,然后实际的python文件: clenotes.py $*
我$*
从这里得到了
它是否收回回车?
我认为你的问题是clenotes.cfg
有DOS行结尾,Python误解了.尝试改变这一行clenotes.py
config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home')))
Run Code Online (Sandbox Code Playgroud)
阅读
config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home'), "rU"))
Run Code Online (Sandbox Code Playgroud)
"rU"告诉Python,即使它在Unix系统上运行,它也应该准备好处理包含DOS行结尾的文件.请参阅http://docs.python.org/library/functions.html#open - 向下滚动到"除了标准fopen()
模式......" 之外的段落.
(或者你可以运行这个命令:perl -pi.bak -e 's/[ \t\r]+$// clenotes.cfg
- 将它转换为Unix行结尾.在你的鞋子里,我可能会这两个.)
(如果以上建议都没有帮助,我接下来要做的clenotes.py
就是使用上面的perl命令.我不知道这可能是什么问题,但如果\r
字符不是来自clenotes.cfg
,那么.py
文件是唯一的可信的剩余来源.)
(编辑:基于您对问题本身的评论,我现在认为clenotes.cmd
是shell脚本包装器,需要从DOS转换为Unix行结尾.)
归档时间: |
|
查看次数: |
2079 次 |
最近记录: |