Python:optparse可以将ACTION属性同时用作STORE和STORE_TRUE吗?

时间:2014-02-12 08:33:16

标签: python action store argparse optparse

我使用optparse来获取命令行输入。

假设我正在运行脚本demo.py,它会创建一些输出。但除非我指定命令行输入,否则输出不会写入文件。

我正在尝试执行以下操作:

命令行中的

python demo.py应该运行脚本,但不能将输出写入任何地方。

命令行中的

python demo.py -o应将输出写入我的默认文件名output.txt

命令行中的

python demo.py -o demooutput.txt应将输出写入文件demooutput.txt

PS:我不想从argparse切换到optparse

3 个答案:

答案 0 :(得分:2)

您可以使用optparse-callbacks来实现此目的。以下是它对您的用例的效果。

parser.add_option("-o", action="callback", dest="output", callback=my_callback)

def my_callback(option, opt, value, parser):
     if len(parser.rargs) > 0:
         next_arg = parser.rargs[0]
         if not next_arg.startswith("-"):
             # Next argument is not another option
             del parser.rargs[0]
             setattr(parser.values, option.dest, next_arg)
             return
     # If not processed, set the default value
     setattr(parser.values, option.dest, "output.txt")

答案 1 :(得分:1)

我认为不幸的是 - 我能想到的唯一方法是通过添加自己的逻辑语句来解决问题。以下代码应该可以解决问题。

import re, sys
import optparse from OptionParser    
usage = "usage: %prog [options] arg"
parser = OptionParser(usage)
if '-f' in argv:
    a = argv.index('-f')
    if (a != len(argv)-1) and re.search('[.]txt', argv[a+1]):
        parser.add_option("-f", "--foo", dest="foo")
    else:
        parser.add_option("-f", dest="foo", action="store_true")

答案 2 :(得分:1)

这并没有回答直接问题,'如何定义一个Action ......',但它以一种简单的方式处理输入。

'-o'设为'store_true'。如果为True,请检查'args'变量的文件名。

(options, args) = parser.parse_args()
if options.o:
    if args:
        dest = args[0]
    else:
        dest = 'output.txt'
else:
    dest = ''

(在argparse中,等效的是用nargs='?'定义位置参数。)

如果这些是唯一的参数,您也可以在不需要`-o'的情况下检查文件名。

另一种可能性 - 'store_const',位置'filename'具有优先级:

parser = optparse.OptionParser()
parser.add_option('-o',dest='dest',action='store_const', const='output.txt', default='')
(options, args) = parser.parse_args()
if args:
    options.dest = args[0]
print options