更新/解决方案:答案在下面from Zack。实际上,问题出在脚本文件本身clenotes.cmd上的DOS行结尾。由于我对各种文件进行了太多修改,因此删除了整个目录,然后从HERE重新下载了一个新副本。我在文件上运行Zack的perl脚本,如下所示:
perl -pi.bak -e 's/[ \t\r]+$//' clenotes.cmd
然后,我对命令执行进行了少许编辑,以使最终脚本变为:
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" "$@"
就是这样-其他所有方法都起作用。无需对clenotes.py或clenotes.cfg进行任何编辑。非常感谢您坚持这个问题,我想这个问题很简单。
更新:我正在缩减一些代码,以使其更具可读性并从帖子中删除不必要的信息。
我试图让Lotus Notes command line在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
我在变量方面度过了艰难的时光,因此对于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 $*
我从目录中运行它。无论如何,令我感到困惑的是,它没有选择我从命令行传递的任何选项。
clenotes.cmd --help
结果No commands specified. Use --help option for usage.
这是应该解析命令行参数的部分:
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)
我在32位chroot环境中的64位Arch Linux上使用Python 3.1.3。我还能提供什么吗?
万一需要它... HERE是整个clenotes.py文件。
另外,根据注释中的要求,配置文件(包含帮助消息和可行的选项/参数)为HERE。
更新
经过很多摆弄之后,我取得的最好进步就是检查了(main)方法中opts和args的设置。最令人惊讶的是,当传递一个参数然后使用
print sys.argv
查看它的解析结果时,该选项中会附带一个尾随的\r
。例如:clenotes.cmd appointments
args is ['appointments\r']
在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 $*
所以...一堆路径的东西,然后是实际的python文件:
clenotes.py $*
我从HERE得到了
$*
是捡回车吗?
最佳答案
我认为您的问题是clenotes.cfg
具有DOS行尾,这是Python的错误解释。尝试更改这行clenotes.py
config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home')))
阅读
config.readfp(open('%sconfig/clenotes.cfg' % System.getProperty('jython.home'), "rU"))
“rU”告诉Python,即使它在Unix系统上运行,也应准备好处理包含DOS行尾的文件。请参阅http://docs.python.org/library/functions.html#open -向下滚动到“除了标准
fopen()
模式...之外”开头的段落。(或者,您可以运行以下命令:
perl -pi.bak -e 's/[ \t\r]+$// clenotes.cfg
-将其转换为Unix行尾。在您的鞋子中,我可能会两者都做。)(如果以上建议均无济于事,那么我接下来要尝试的是使用上述perl命令击打
clenotes.py
本身。我看不出是怎么回事,但是如果\r
字符不是来自clenotes.cfg
,则不是.py
文件是唯一可能的剩余来源。)(编辑:根据您对问题本身的评论,我现在认为是
clenotes.cmd
(shell脚本包装器),需要将其从DOS转换为Unix行结尾。)