如何使sys.argv参数为可选? (Python)

问题描述 投票:13回答:6

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

仅正常运行程序。

python command-line-arguments sys
6个回答
2
投票

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”提供,而将[[subcommands作为“ add”提供。有一个subcommand implementation in argparse


9
投票
您可以使用更多高级库:argparseoptparseopster。它们都支持可选参数。

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:]
以下所有与此有关的工作

$ 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

如果要求在每个名称前添加'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.'


原始

似乎最好使用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
投票
您应该使用诸如getopt或argparse之类的命令行解析器。这些允许您定义可选的选项并具有默认值。

0
投票
您可以在argparse中使用here找到答案。使用getoptopster的解决方案将被投票为最受欢迎的答案,而不是该答案。

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

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

#!/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

© www.soinside.com 2019 - 2024. All rights reserved.