2015-04-29 4 views
3

В сценарии, который я пишу, я использую argparse для основных аргументов (для -help, --todo и т. Д.). но пытается использовать sys.argv для получения имени файла, указанного в качестве третьего аргумента для -add. Я использовал это:Попытка использования argparse и sys.argv без sys.argv, которые необходимо использовать в каждой среде выполнения

def parseargs(): 
    parser = argparse.ArgumentParser(add_help=False) 

    parser.add_argument("--help", help="Print argument usage", action="store_true") 
    parser.add_argument("--memo", help="Read memo file", action="store_true") 
    parser.add_argument("--todo", help="Read TODO file", action="store_true") 
    parser.add_argument("--trackedfiles", help="Read tracked files list", action="store_true") 

    parser.add_argument("--add", help="Add a file to trackedfiles", action="store_true") 
    parser.add_argument("--edit", help="Edit file in .wpm_data with editor", action="store_true") 
    parser.add_argument("--newdir", help="Create a new directory to initialize user-data", action="store_true") 

    parser.add_argument("file") 

    p_args = parser.parse_args() 

    if p_args.help: 
     printargs() 
     sys.exit() 

    if p_args.memo: 
     print_memo() 
     sys.exit() 

    if p_args.todo: 
     print_todo() 
     sys.exit() 

    if p_args.trackedfiles: 
     print_trackedfiles() 
     sys.exit() 

    if p_args.add: # this is were I'm stumpped 
     if p_args.file == sys.argv[2]: 
      givenfile = p_args.file 
     else: 
      pass 

     print("[!]\t", givenfile, "to be added to trackedfiles") 

     sys.exit() 

Который работает так:

./main.py --add textfile.txt 
[!] textfile.txt to be added to trackedfiles 

Но когда другой аргумент будет использоваться как --help, необходимо использовать для givenfile третий аргумент

./main.py --help    
usage: main.py [--help] [--memo] [--todo] [--trackedfiles] [--add] [--edit] 
       [--newdir] 
       file 
    main.py: error: the following arguments are required: file 

Как я могу отделить использование argparse и sys.argv, когда sys.argv не нужно постоянно использовать, чтобы его можно было вызывать только тогда, когда запускается функция, которая ему нужна?

+0

Ваш оператор 'if' возвращает true на' p_args.add', потому что вы делаете 'store_true', даже если вы не используете' --add' при запуске программы – letsc

ответ

2

Вы делаете это неправильно. Вот несколько примеров, которые помогут вам понять, как использовать argparse. Флаги не являются булевыми, они могут иметь значения.

import argparse 
parser = argparse.ArgumentParser(description="This program does cool things.") 

parser.add_argument("--add", help="Add a file to trackedfiles") 
parser.add_argument("--dell", help="Delete file") 
parser.add_argument("--copy", help="Copy file") 
p_args = parser.parse_args() 

print "Add-->.", p_args.add 
print "Dell->.", p_args.dell #del is reserved word so we use dell 
print "Copy->.", p_args.copy 

И вот использование.

$ python p.py --dell file1.txt --copy file2.txt --add file3.txt 
Add-->. file3.txt 
Dell->. file1.txt 
Copy->. file2.txt 

Надеюсь, это поможет.

+0

Большое спасибо, вы спасатель. – tolbiac

0

Я предполагаю, немного относительно того, что вы хотите сделать, но вот мое предложение:

def parseargs(): 
    parser = argparse.ArgumentParser() 
    # use the normal help, unless your `printargs` is much better 
    parser.add_argument("--memo", help="Read memo file", action="store_true") 
    parser.add_argument("--todo", help="Read TODO file", action="store_true") 
    parser.add_argument("--trackedfiles", help="Read tracked files list", action="store_true") 

    parser.add_argument("--add", help="Add a file to trackedfiles") # takes a filename argument 
    parser.add_argument("--edit", help="Edit file in .wpm_data with editor") # takes a filename argument 
    parser.add_argument("--newdir", help="Create a new directory to initialize user-data") # takes a directory name argument 

    p_args = parser.parse_args() 

    if p_args.memo: 
     print_memo() 
    eliif p_args.todo: 
     print_todo() 
    elif p_args.trackedfiles: 
     print_trackedfiles() 
    elif p_args.add: # could be 'if is not None:' 
     add_file(p_args.add) 
    elif p_args.edit: 
     .... 

Так что большое изменение делает «имя файла» аргумента «--add» или '--edit', а не позиционный. Если это требуемый позиционный аргумент, вы получите сообщение об ошибке, если вы опустите его с аргументами, такими как --memo.

В качестве альтернативы file может быть позицией nargs='?'.

Вы также можете установить это как кэш подпарантов, где memo,todo,trackfiles,add,etc - все «команды». Некоторые из этих подпараметров будут принимать аргумент «файл», другие - нет. Я ожидаю, что кто-то еще подумает над этим.

How do I check for a particular subparser? имеет хороший ответ subparsers.


не-subparsers альтернатива:

parser = argparse.ArgumentParser() 
parser.add_argument('cmd', 
    choices=['memo','todo','trackfiles','add','edit','newdir'], 
    help='action to take') 
parser.add_argument('name',nargs='?',help='file or dir name') 
args = parser.parse_args() 
if args.cmd in ['memo']: 
    print_memo() 
elif args.cmd in ['todo']: 
    ... 
elif args.cmd in ['add']: 
    add_file(args.name) 
elif ... 

Это должно принимать команды, как prog.py memo, prog.py add myfile. add_file(afilename) должен делать что-то умное, если его аргумент None или плохое имя файла.

Если вы хотите принять более одной из этих «команд» для каждого звонка, нам нужно будет внести некоторые изменения.

Смежные вопросы