Python OptionParser-支持命令行末尾的任何选项

Python OptionParser-支持命令行末尾的任何选项,python,optparse,Python,Optparse,我正在编写一个小程序,它应该在远程服务器上执行一个命令(比如说,在ssh[hostname][command]周围有一个相当愚蠢的包装器) 我想这样执行它: ./floep [command] /floep[命令] 但是,我需要不时传递某些命令行: ./floep -v [command] /floep-v[命令] 所以我决定使用optparse.OptionParser来实现这一点。问题是,我有时命令也有参数,如果我这样做了,它可以正常工作: ./floep -v "uname -a" ./f

我正在编写一个小程序,它应该在远程服务器上执行一个命令(比如说,在
ssh[hostname][command]
周围有一个相当愚蠢的包装器)

我想这样执行它:

./floep [command] /floep[命令] 但是,我需要不时传递某些命令行:

./floep -v [command] /floep-v[命令] 所以我决定使用optparse.OptionParser来实现这一点。问题是,我有时命令也有参数,如果我这样做了,它可以正常工作:

./floep -v "uname -a" ./floep-v“uname-a” 但我也希望它在我使用:

./floep -v uname -a /floep-v uname-a 这个想法是,一旦我遇到第一个非选项参数,之后的一切都应该是我命令的一部分

然而,这给了我:

Usage: floep [options] floep: error: no such option: -a 用法:floep[选项] floep:错误:没有这样的选项:-a OptionParser支持这种语法吗?如果是:如何?
如果没有:解决此问题的最佳方法是什么?

您可以使用如下bash脚本:

#!/bin/bash
while [ "-" == "${1:0:1}" ] ; do
  if [ "-v" == "${1}" ] ; then
    # do something
    echo "-v"
  elif [ "-s" == "${1}" ] ; then
    # do something
    echo "-s"
  fi
  shift
done
${@}
${@}提供了shift调用未使用的命令行的其余部分。 要使用ssh,只需将行从 ${@} 到 ssh${user}@${host}${}

test.sh echo bla
布拉

test.sh-v回波bla
-v
布拉

test.sh-v-s回波bla
-v
-s

bla

OptionParser实例实际上可以在复杂情况的解析操作期间进行操作。然而,在这种情况下,我相信您描述的场景是开箱即用的(如果是真的,这将是一个好消息!这种情况发生的频率有多高??)。请参阅文档中的此部分:

引用上面的链接:

禁用散布的参数()

将解析设置为在第一个非选项上停止。如果你有一个 运行另一个命令的命令处理器,该命令具有其 拥有,您希望确保这些选项不会混淆。例如 每个命令可能有一组不同的选项

试用

运行时:

$ ./options.py foo -v bar Options: {'verbose': None} args: ['foo', '-v', 'bar'] $ ./options.py -v foo bar Options: {'verbose': True} args: ['foo', 'bar'] $ ./options.py foo -a bar Options: {'verbose': None} args: ['foo', '-a', 'bar'] $./options.py foo-v条 选项:{'verbose':None}参数:['foo','-v',bar'] $./options.py-v foo-bar 选项:{'verbose':True}参数:['foo','bar'] $./options.py foo-a条 选项:{'verbose':None}参数:['foo','-a','bar']
非常感谢。这是一个非常彻底的答案,工作非常完美,即使您的答案可能是正确的,对我来说,这是一个python练习 $ ./options.py foo -v bar Options: {'verbose': None} args: ['foo', '-v', 'bar'] $ ./options.py -v foo bar Options: {'verbose': True} args: ['foo', 'bar'] $ ./options.py foo -a bar Options: {'verbose': None} args: ['foo', '-a', 'bar']
from optparse import OptionParser
import subprocess
import os
import sys

parser = OptionParser()
parser.add_option("-q", "--quiet",
                  action="store_true", dest="quiet", default=False,
                  help="don't print output")
parser.add_option("-s", "--signal",
                  action="store_true", dest="signal", default=False,
                  help="signal end of program and return code")

parser.disable_interspersed_args()
(options, command) = parser.parse_args()

if not command:
    parser.print_help()
    sys.exit(1)

if options.quiet:
    ret = subprocess.call(command, stdout=open(os.devnull, 'w'), 
                             stderr=subprocess.STDOUT)
else:
    ret = subprocess.call(command)

if options.signal:
    print "END OF PROGRAM!!! Code: %d" % ret