2015-04-29 52 views
3

在我正在寫的腳本中,我使用argparse作爲主參數(for --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

因爲你做了'store_true',即使你在運行程序時不使用'--add',你的'if'語句在'p_args.add'上返回true – 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」或' - 編輯'標誌,而不是位置。如果它是一個必需的位置參數,如果用像--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 memoprog.py add myfileadd_file(afilename)應該做一些聰明的事情,如果它的參數是None或一個錯誤的文件名。

如果您希望每次調用都接受多個這些'命令',那麼我們需要進行一些更改。