2011-03-19 38 views
1

以下「parser.add_option」語句可以工作,但如果腳本運行時沒有選項/ arg,它不會發出抱怨。如果沒有指定選項/參數,我希望它顯示幫助(-h/--help)作爲默認值。其次,如果我啓用下面的snip,即使指定了一個選項/ arg,我也會得到「錯誤:不正確的參數數目」。設置並要求使用默認的Python腳本OptionParser

if len(args) < 1: 
parser.error("incorrect number of arguments") 

謝謝。


更新的代碼與回溯誤差低於

def main(): 
    usage = "usage: %prog [options] arg" 
    parser = OptionParser(usage) 
    parser.add_option('-d', '--directory', 
      action='store', dest='directory', 
      default=None, help='specify directory') 
    parser.add_option('-f', '--file', 
      action='store', dest='filename', 
      default=None, help='specify file') 
    parser.add_option('-v', '--version', 
         action="store_true", dest="show_version", 
         default=False, help='displays the version number') 
    if len(sys.argv) == 1: 
     parser.print_help() 
     sys.exit() 
    (options, args) = parser.parse_args() 

#if options.show_version: 
# prog = os.path.basename(sys.argv[0]) 
# version_str = "1.0" 
# print "version is: %s %s" % (prog, version_str) 
# sys.exit(0) 

filenames_or_wildcards = [] 

# remove next line if you do not want allow to run the script without the -f -d 
# option, but with arguments 
filenames_or_wildcards = args # take all filenames passed in the command line 

# if -f was specified add them (in current working directory) 
if options.filename is not None: 
    filenames_or_wildcards.append(options.filename) 

回溯

$ python boto-backup.py Traceback (most recent call last): File "boto-backup.py", line 41, in <module> 
    filenames_or_wildcards = args # take all filenames passed in the command line NameError: name 'args' is not defined 
+0

'len(args)'總是至少有一個,因爲'args [0]'是python腳本本身的名字。你有沒有意思'如果len(args)== 1' – 2011-03-19 01:56:52

+1

@TheSoundOfMatt:你在考慮'sys.argv'。在這種情況下,len(args)在OP的場景中等於零(沒有命令行輸入)。 – bernie 2011-03-19 02:09:46

+0

對不對。 oops :) – 2011-03-21 05:19:27

回答

1

我會做這樣的事情:

from optparse import OptionParser 
import sys 

def main(): 
    usage = "usage: %prog [options] arg" 
    parser = OptionParser(usage) 
    parser.add_option('-d', '--directory', 
      action='store', dest='directory', 
      default=None, help='specify directory') 
    parser.add_option('-f', '--file', 
      action='store', dest='filename', 
      default=None, help='specify file') 
    parser.add_option('-v', '--version', 
         action="store_true", dest="show_version", 
         default=False, help='displays the version number') 
    if len(sys.argv) == 1: 
     parser.print_help() 
     sys.exit() 
    (options, args) = parser.parse_args() 
    # rest of program... 

if __name__ == '__main__': 
    main() 

所以我們設置瞭解析器和選項,然後檢查是否有任何命令行輸入。
如果沒有,我們打印幫助信息並退出。否則,我們繼續執行程序。

當不帶命令行參數運行的輸出爲:

 
Usage: your_script_name_here.py [options] arg 

Options: 
    -h, --help   show this help message and exit 
    -d DIRECTORY, --directory=DIRECTORY 
         specify directory 
    -f FILENAME, --file=FILENAME 
         specify file 
    -v, --version   displays the version number 

編輯(響應於更新後的代碼):
空白/壓痕是在Python重要。
確保您的代碼的其餘部分縮進,使其屬於main()函數。
filenames_or_wildcards = []開始,您的代碼超出了main()函數的範圍,因此沒有名爲args的變量。

+0

@Astron:請編輯您的問題以包含回溯。在定義之前,您正在使用'args'。 – bernie 2011-03-19 02:20:12

+0

我應該更新我的問題中的代碼嗎? – Astron 2011-03-19 02:27:37

+0

@Astron:請參閱編輯答案。 – bernie 2011-03-19 02:38:07