Python sys.argv [1:]没有获取命令行选项

时间:2011-02-03 23:35:54

标签: python linux command-line jython lotus-notes

更新/解决方案:答案如下,from Zack。确实,问题是脚本文件本身的DOS行结尾,clenotes.cmd。由于我对各种文件非常感兴趣,我删除了整个目录,然后从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环境中使用Arch Linux 64bit上的Python 3.1.3。我可以提供其他任何东西吗?

以防万一需要...... HERE是整个clenotes.py文件。

此外,根据评论中的要求,配置文件(包含帮助消息和可行的选项/参数,是HERE


更新

经过大量的摆弄,我所取得的最佳进展是在(主)方法中检查它的设置为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

获得$*

是否收回回车费?

2 个答案:

答案 0 :(得分:5)

我认为你的问题是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。我不知道这可能是什么问题,但如果{{1来自\r字符,clenotes.cfg文件是唯一合理的剩余来源。)

(编辑:根据您对问题本身的评论,我现在认为它是.py,shell脚本包装器,需要从DOS转换为Unix行结尾。)

答案 1 :(得分:3)

我必须继续寻找\ r来自哪里。但与此同时,这个问题变得更加简单。解析args后,执行以下操作:

args = [arg.strip() for arg in args]

这将摆脱\r

编辑:但等等 - 这只是部分解决方案吗?它仍然没有正确解析选项吗?

EDIT2:似乎需要先删除\r。如果没有命令,则/r永远不会被剥离,因为上述内容仅在\r完成后剥离getopt。这对我来说应该是显而易见的 - 而不是在这里传递sys.argv[1:]

opts, args = getopt.getopt(sys.argv[1:], '', cliOptions2)

先修改

argv = [arg.strip() for arg in sys.argv[1:]]
opts, args = getopt.getopt(argv, '', cliOptions2)

你也可以做sys.argv[-1] = sys.argv[-1].strip() ...但是我的c程序员开始觉得有点不安。我知道可能是非理性的。

或者只是做Zack所说的并将clenotes.cmd转换为linux格式 - 但请注意,这里的剥离将确保其他人不必再次解决同样的问题。 (另一方面,对于不期待这些问题的人来说,这有点难看,或者至少是神秘的。)