在python中__CODE__,我如何指示它忽略提供给方法的未定义选项__CODE__?
例如,
我只__CODE__为我的__CODE__实例定义了选项,但我__CODE__用list 调用了
__CODE__
编辑:
我不在乎它是否将它们从原始列表中过滤掉.我只想忽略未定义的选项.
我这样做的原因是因为我使用SCons的AddOption接口来添加自定义构建选项.但是,其中一些选项指导了目标的声明.因此,我需要在脚本中的不同点解析sys.argv,而无需访问所有选项.最后,顶级Scons OptionParser将捕获命令行中的所有未定义选项.
当我从OptionParser文档中运行此示例时:
require 'optparse'
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: example.rb [options]"
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options[:verbose] = v
end
end.parse!
p options
p ARGV
Run Code Online (Sandbox Code Playgroud)
并输入:ruby test.rb -v 100,它返回:
{:verbose=>true}
["100"]
Run Code Online (Sandbox Code Playgroud)
不应该是冗长的100,不是布尔值?
我不知道这个,有没有人有任何建议?
为什么我没有__getitem__字典的属性错误:
Traceback (most recent call last):
File "./thumbnail.py", line 39, in <module>
main()
File "./thumbnail.py", line 19, in main
options['input_pattern']
AttributeError: Values instance has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
这是代码:
#!/usr/bin/env python
import os, sys, glob
from PIL import Image
from optparse import OptionParser
def batch_convert(src_dir, input_pattern, output_ext = None, dest_dir = None):
return 0
def main():
print sys.argv
parser = OptionParser()
parser.add_option("-s", "--source-dir", dest="src_dir", help="Source directory to fetch images")
parser.add_option("-d", "--dest-dir", dest="dest_dir", help="Destination directory to writen processed images")
parser.add_option("-i", …Run Code Online (Sandbox Code Playgroud) 我现在一直在使用optparse,并希望添加从配置文件加载参数的功能.
到目前为止,我能想到的最好的是一个带有硬编码参数的包装批处理脚本......看起来很笨拙.
这样做最优雅的方法是什么?
我正在尝试单元测试一些看起来像这样的代码:
def main():
parser = optparse.OptionParser(description='This tool is cool', prog='cool-tool')
parser.add_option('--foo', action='store', help='The foo option is self-explanatory')
options, arguments = parser.parse_args()
if not options.foo:
parser.error('--foo option is required')
print "Your foo is %s." % options.foo
return 0
if __name__ == '__main__':
sys.exit(main())
Run Code Online (Sandbox Code Playgroud)
使用如下代码:
@patch('optparse.OptionParser')
def test_main_with_missing_p4clientsdir_option(self, mock_optionparser):
#
# setup
#
optionparser_mock = Mock()
mock_optionparser.return_value = optionparser_mock
options_stub = Mock()
options_stub.foo = None
optionparser_mock.parse_args.return_value = (options_stub, sentinel.arguments)
def parser_error_mock(message):
self.assertEquals(message, '--foo option is required')
sys.exit(2)
optionparser_mock.error = parser_error_mock
#
# …Run Code Online (Sandbox Code Playgroud) 我正在使用optparse模块创建一个shell脚本,jut是为了好玩,所以我想打印一个漂亮的ascii绘图来代替描述.
原来这个代码:
parser = optparse.OptionParser(
prog='./spill.py',
description=u'''
/ \
vvvvvvv /|__/|
I /O,O |
I /_____ | /|/|
J|/^ ^ ^ \ | /00 | _//|
|^ ^ ^ ^ |W| |/^^\ | /oo |
\m___m__|_| \m_m_| \mm_|
''',
epilog='''
Las cucarachas lograron con exito su plan, echando a los pestilentes sangre caliente de sus cajas de cemento.
Ahora el hombre es una especie errante en el espacio, un vagabundo errante en las estrellas.''')
Run Code Online (Sandbox Code Playgroud)
渲染如下:
$ ./bin/spill.py -h
Usage: ./spill.py …Run Code Online (Sandbox Code Playgroud) 我有十几个可以通过stdin或选项接受输入的程序,我想以类似的方式为输出实现相同的功能.
optparse代码如下所示:
parser.add_option('-f', '--file',
default='-',
help='Specifies the input file. The default is stdin.')
parser.add_option('-o', '--output',
default='-',
help='Specifies the output file. The default is stdout.')
Run Code Online (Sandbox Code Playgroud)
其余适用的代码如下所示:
if opts.filename == '-':
infile = sys.stdin
else:
infile = open(opts.filename, "r")
if opts.output == '-':
outfile = sys.stdout
else:
outfile = open(opts.output, "w")
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,我喜欢它的简单性 - 但是我无法找到任何使用默认值' - '表示stdout的人的引用.这是一个很好的一致解决方案还是我忽略了更好或更期望的事情?
使用Perl,Getopt::Long您可以轻松定义带有可变数量参数的命令行选项:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
Run Code Online (Sandbox Code Playgroud)
有没有办法直接使用Python的optparse模块?据我所知,nargsoption属性可用于指定固定数量的选项参数,我还没有在文档中看到其他替代方法.
有没有办法在一个Ruby程序中多次启动OptionParser,每个程序都有不同的选项?
例如:
$ myscript.rb --subsys1opt a --subsys2opt b
Run Code Online (Sandbox Code Playgroud)
在这里,myscript.rb将使用subsys1和subsys2,将它们的选项处理逻辑委托给它们,可能是首先处理'a'的序列,然后是单独的OptionParser对象中的'b'; 每次选择仅与该上下文相关的选项.最后阶段可以检查在每个部件处理完他们之后没有任何未知数.
用例是:
在松散耦合的前端程序中,各种组件具有不同的参数,我不希望'main'知道所有内容,只是为每个部分委派参数/选项集.
将一些更大的系统(如RSpec)嵌入到我的应用程序中,我只需通过命令行通过他们的选项,而不知道那些包装器.
我会用一些分隔符选项OK,以及像--或--vmargs在某些Java应用程序.
在Unix世界中有许多类似的东西的实际例子(startx/X,git plumbing和瓷器),其中一层处理一些选项但将其余部分传播到下层.
开箱即用,这似乎不起作用.每次OptionParse.parse!通话都会进行详尽的处理,对任何不知道的事情都会失败.我想我很乐意跳过未知选项.
任何提示,也许是替代方法都是受欢迎的.
当我使用Python的argparse或optparse命令行参数解析器时,参数的任何唯一前缀都被认为是有效的,例如
$ ./buildall.py --help
usage: buildall.py [-h] [-f]
Build all repositories
optional arguments:
-h, --help show this help message and exit
-f, --force Build dirty repositories
Run Code Online (Sandbox Code Playgroud)
作品有--help,--hel,--he的帮助选项,以及--forc与--fo为强制选项.
可以以某种方式关闭此行为吗?我想获得不完整参数的错误消息.