如何使sys.argv参数可选? (蟒蛇)

时间:2012-08-07 20:21:02

标签: python command-line-arguments sys

sys.argv在运行程序时在shell命令行中获取参数。如何使这些参数可选?

我知道我可以使用try - except。但是这会强制你插入没有额外的参数或所有额外的参数,除非你嵌套更多try - except,这使代码看起来更不易读。

修改

假设我想要以下功能,我该如何实现?

$ python program.py add Peter 
'Peter' was added to the list of names.

add参数(而非--add)是可选的,以便

$ python program.py

只是正常运行程序。

6 个答案:

答案 0 :(得分:9)

您可以使用更多高级库:argparseoptparseopster。所有这些都支持可选参数。

答案 1 :(得分:4)

修改 解决您的编辑问题,

import sys

sys.argv = sys.argv[1:]
names = []
while sys.argv and sys.argv[0] == 'add':
    #while the list is not empty and there is a name to add
    names.append(sys.argv[1])
    print sys.argv[1], 'was added to the list of names.'
    sys.argv = sys.argv[2:]

以下所有工作

$ python program.py add Peter
Peter was added to the list of names.

$ python program.py add Peter add Jane
Peter was added to the list of names.
Jane was added to the list of names.

$ python program.py

如果在每个名称之前要求“添加”的优点是,如果在添加名称后您想要查找任何其他参数,则可以。 如果你想通过说python program.py add Peter Jane来传递多个名字,这可以通过一个相当简单的改变来完成

import sys

names = []
if len(sys.argv) > 2 and sys.argv[1] == 'add':
    names = sys.argv[2:]

for n in names:
    print n, 'was added to the list of names.'

<强> ORIGINAL

看起来你会选择像optparse这样的东西会更好。但是,由于sys.argv是一个列表,您可以检查它的长度。

arg1 = sys.argv[1] if len(sys.argv) > 1 else 0 # replace 0 with whatever default you want
arg2 = sys.argv[2] if len(sys.argv) > 2 else 0

然后使用arg1和arg2作为“可选”命令行参数。这将允许您传递1,2或0个命令行参数(实际上您可以传递超过2个并且它们将被忽略)。这也假设参数有一个已知的顺序,如果你想使用-a后跟一个值的标志,请查看optparse http://docs.python.org/library/optparse.html?highlight=optparse#optparse

答案 2 :(得分:2)

您应该使用命令行解析器,例如getopt或argparse。这些允许您定义可选的选项并具有默认值。

答案 3 :(得分:2)

作为对问题的简单答案,可以在sys.argv中使用一个可选参数,但是如果您预见到模块将扩展很多,则可能需要考虑在其他地方建议使用的另一个模块,例如argparse。 / p>

这将不忽略任何参数,但之后允许任意数量的参数。

#!/usr/bin/env python

import sys

added = sys.argv[1:]
if added:
    for add in added:
        print("{0} was added to the list of names.".format(add))
$ ./test.py
$ ./test.py Peter
Peter was added to the list of names.

当然,您不会仅通过add Peter来传递Peter。但是,如果可以接受,那么就可以了。

我的意思是,您当然可以使用sys做可选的args,实际上,对于非常简单的脚本,如果足够的话,通常不必使用argparse

答案 4 :(得分:1)

plac是其他答案中给出的标准库模块的替代方案。 它允许通过annotations定义命令行参数。从文档中,例子8演示了可选参数语法:

example8.py
def main(command: ("SQL query", 'option', 'q'), dsn):
    if command:
        print('executing %s on %s' % (command, dsn))
        # ...

if __name__ == '__main__':
    import plac; plac.call(main)

Argparse例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--add", help="Add prefix to string")
args = parser.parse_args()

请注意,约定是将可选参数提供为“--add”,而子命令提供为“add”。有subcommand implementation in argparse

答案 5 :(得分:0)

您可以使用argparse here找到答案。使用getoptopster的解决方案将被视为最受欢迎的答案,而不是此答案。