2014-11-10 4 views
0

Как включить имена программ с пробелами (например, git status) в docopt? У меня есть настройка, где скрипт Perl отправляет скрипт Python. Сценарий Perl можно назвать многими способами, скажем, для простоты: prog sub1 sub2. Таким образом, скрипт Perl имеет имя prog. Теперь он отправляет скрипт Python под названием sub2 с использованием sub2 --progName="prog sub1 sub2" [options]. (Таким образом, имя реальной программы не sub2, но prog sub1 sub2). Я пытался реализовать эту схему, используя docopt, например:Включить пробелы в имени программы в docopt

"""Usage: %progName% [-h] 

Options: 
    -h --help 
""" 

from docopt import docopt 
import sys 

if __name__ == '__main__': 
    progName=sys.argv[0] 
    for i, arg in enumerate(sys.argv): 
     if arg.startswith('--progName='): 
      ind=arg.index("=")+1 
      progName=arg[ind:] 
      del sys.argv[i] 
      break 
    doc=__doc__.replace('%progName%',progName) 
    args = docopt(doc) 
    print(args) 

Однако, это не работает с пробелами в имени команды (prog sub1 sub2) ..

ответ

0

Это может быть сделано с помощью help=False вариант комбинированного с исключением DocoptExit:

"""Usage: %progName% [-h] 

Options: 
    -h --help 
""" 

from docopt import docopt, DocoptExit 
import sys 

if __name__ == '__main__': 
    progName=sys.argv[0] 
    for i, arg in enumerate(sys.argv): 
     if arg.startswith('--progName='): 
      ind=arg.index("=")+1 
      progName=arg[ind:] 
      del sys.argv[i] 
      break 

    usage=False 
    try: 
     args = docopt(__doc__, help=False) 
     if args['--help']: 
      usage=True 
    except DocoptExit as e: 
     usage=True 
     print ("Bad arguments!") 
    if usage: 
     print(__doc__.replace('%progName%',progName)) 
     raise SystemExit 
    print(args) 
Смежные вопросы