2014-02-12 5 views
0

Я использую optparse, чтобы получить ввод командной строки.Python: Может ли optparse иметь атрибут ACTION действовать как STORE и STORE_TRUE?

Допустим, что я запускаю скрипт demo.py, и он создает некоторый вывод. Но если я не укажу ввод командной строки, вывод не будет записан в файл.

Я пытаюсь сделать следующее:

python demo.py в командной строке необходимо запустить скрипт, но не писать вывод в любом месте.

python demo.py -o в командной строке должен записать вывод в мое имя по умолчанию output.txt.

python demo.py -o demooutput.txt в командной строке должен записать вывод в файл demooutput.txt.

PS: Я бы не стал переключаться на argparse от optparse.

+2

* Я бы предпочел, чтобы переключиться на '' argparse' из optparse' *. Жаль, потому что это сделало бы ваш случай использования тривиальным для реализации. –

+0

@MartijnPieters: Я не могу использовать argparse, поскольку я вынужден работать с использованием старой версии python. – user3300676

+0

Сколько лет версии? 'argparse' хорошо работает (или, по крайней мере, доступна версия, совместимая с) Python 2.4 после ее установки. – chepner

ответ

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") 
+0

Я немного изменил его в соответствии с моими потребностями. Прекрасно работает! Большое спасибо за вашу помощь! – user3300676

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") 
1

Это не отвечает на прямой вопрос «как определить действие ...», но он обрабатывает входы простым способом.

Комплект '-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', с позиционной 'имя файла' имеет приоритет:

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 
+0

Я не думаю, что это сработает, если у меня будет более одного дополнительного ввода. Скажите «python demo.py [-o outputfilename] [-s startvalue]. Обратите внимание, что вход« начального значения »также является необязательным. – user3300676

+0

В этом случае' argparse' с 'nargs = '?'' Имеет большое преимущество. может использовать 'argparse' с более старым Python, просто поместив копию' argparse.py' в вашей собственной кодовой директории. – hpaulj

+0

Да, он будет работать с nargs = '?'. Благодарю. На мой взгляд, не рекомендуется копировать файлы импорта в рабочий каталог. Если бы у меня не было optparse, я, возможно, пошел бы так. Большое спасибо за вашу помощь! – user3300676