我使用optparse
来获取命令行输入。
假设我正在运行脚本demo.py
,它会创建一些输出。但除非我指定命令行输入,否则输出不会写入文件。
我正在尝试执行以下操作:
命令行中的 python demo.py
应该运行脚本,但不能将输出写入任何地方。
python demo.py -o
应将输出写入我的默认文件名output.txt
。
python demo.py -o demooutput.txt
应将输出写入文件demooutput.txt
。
PS:我不想从argparse
切换到optparse
。
答案 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