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
blaOptionParser实例实际上可以在复杂情况的解析操作期间进行操作。然而,在这种情况下,我相信您描述的场景是开箱即用的(如果是真的,这将是一个好消息!这种情况发生的频率有多高??)。请参阅文档中的此部分: 引用上面的链接: 禁用散布的参数() 将解析设置为在第一个非选项上停止。如果你有一个 运行另一个命令的命令处理器,该命令具有其 拥有,您希望确保这些选项不会混淆。例如 每个命令可能有一组不同的选项 试用 运行时: $ ./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