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

Ben*_*ey4 13 python sys command-line-arguments

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

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

编辑

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

$ python program.py add Peter 
'Peter' was added to the list of names.
Run Code Online (Sandbox Code Playgroud)

这个add参数(而不是--add)是可选的

$ python program.py
Run Code Online (Sandbox Code Playgroud)

只是正常运行程序.

Fed*_*lev 9

您可以使用更多高级库:argparse,optparse,opster.它们都支持可选参数.


Rya*_*ing 5

编辑 以解决您的修改,

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:]
Run Code Online (Sandbox Code Playgroud)

以下所有与此相关的工作

$ 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
Run Code Online (Sandbox Code Playgroud)

如果要求在每个名称前加上“ add”的好处是,如果要在添加名称后查找其他参数,则可以。如果要通过说来传递多个名称,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.'
Run Code Online (Sandbox Code Playgroud)

原版的

似乎您最好选择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
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*bey 4

plac是其他答案中给出的标准库模块的替代方案。它允许通过注释定义命令行参数。从文档中,示例 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)
Run Code Online (Sandbox Code Playgroud)

argparse 示例:

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

请注意,约定将可选参数提供为“--add”,而子命令则提供为“add”。argparse 中有一个子命令实现。