Python 系统.argv[1 :] not picking up command line options

标签 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 64 位上使用 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 行尾。)

关于Python 系统.argv[1 :] not picking up command line options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893010/

相关文章:

python - Django表格错误打印

linux - 不完整的 IP 地址用零填充

linux - cp 命令在不存在的文件上发生冲突

命令行上显示的 Java 版本与安装的版本不同

python - 在 django 页面中允许 'fuzzy' 翻译?

python - 正则表达式:如何匹配字符串末尾的键值对序列

python - 根据 2 列值过滤数据框

objective-c - 适用于 Linux 的 Apple iOS IDE?

linux - 如何在 Linux 中为电子邮件添加颜色编码?

powershell - 如何通过使用 Powershell 使用 Get-Credentials 进行身份验证从 OneDrive 下载文件?