2014-02-11 74 views
2

我必須將命令行參數存儲在變量中,或者爲其分配默認值。將Python命令行參數分配給變量

我想做的是低於

import sys 
Var=sys.argv[1] or "somevalue" 

我收到錯誤出指數的,如果我不指定任何參數。如何解決這個問題?

+0

也許用更structur編輯的方法,請參閱http://stackoverflow.com/questions/1009860/command-line-arguments-in-python?rq=1 – Barmar

+0

@Barmar:原則上是的,但這對這種情況是矯枉過正,你不覺得嗎? –

+0

也許吧。我們沒有看到完整的背景。 – Barmar

回答

5
Var=sys.argv[1] if len(sys.argv) > 1 else "somevalue" 
+0

很好的一行,我幾個星期前纔開始使用這種'perl-like'方法。 – bjd2385

2

好問題。

我認爲最好的辦法是做

try: 
    var = sys.argv[1] 
except IndexError: 
    var = "somevalue" 
0

嘗試用命令行處理模板如下:

def process_command_line(argv): 
    ... 
    # add your option here 
    parser.add_option('--var', 
     default="somevalue", 
     help="your help text") 

def main(argv=None): 
    settings, args = process_command_line(argv) 
    ... 
    print settings, args # <- print your settings and args 

與下面的模板運行./your_script.py和您的修改上面打印{'var': 'somevalue'} []

有關命令行處理模板的示例,請參閱中的示例代碼像Pythonista:地道的Pythonhttp://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#command-line-processing):

#!/usr/bin/env python 

""" 
Module docstring. 
""" 

import sys 
import optparse 

def process_command_line(argv): 
    """ 
    Return a 2-tuple: (settings object, args list). 
    `argv` is a list of arguments, or `None` for ``sys.argv[1:]``. 
    """ 
    if argv is None: 
     argv = sys.argv[1:] 

    # initialize the parser object: 
    parser = optparse.OptionParser(
     formatter=optparse.TitledHelpFormatter(width=78), 
     add_help_option=None) 

    # define options here: 
    parser.add_option(  # customized description; put --help last 
     '-h', '--help', action='help', 
     help='Show this help message and exit.') 

    settings, args = parser.parse_args(argv) 

    # check number of arguments, verify values, etc.: 
    if args: 
     parser.error('program takes no command-line arguments; ' 
        '"%s" ignored.' % (args,)) 

    # further process settings & args if necessary 

    return settings, args 

def main(argv=None): 
    settings, args = process_command_line(argv) 
    # application code here, like: 
    # run(settings, args) 
    return 0  # success 

if __name__ == '__main__': 
    status = main() 
    sys.exit(status) 
1

的內置argparse模塊是爲究竟這些類型的任務:

import argparse 

# Set up argument parser 
ap = argparse.ArgumentParser() 

# Single positional argument, nargs makes it optional 
ap.add_argument("thingy", nargs='?', default="blah") 

# Do parsing 
a = ap.parse_args() 

# Use argument 
print a.thingy 

或者,如果你堅持使用Python 2.6或更早版本,並且不希望在backported argparse module添加一個要求,你可以手動做類似的事情,像這樣:

import optparse 

opter = optparse.OptionParser() 
# opter.add_option("-v", "--verbose") etc 
opts, args = opter.parse_args() 

if len(args) == 0: 
    var = "somevalue" 
elif len(args) == 1: 
    var = args[0] 
else: 
    opter.error("Only one argument expected, got %d" % len(args)) 

print var 
+0

爲什麼不直接'opter.add_option(' - var',default =「somevalue」)'?看到我的答案。 – wolfrevo