如何使sys.argv参数成为可选参数?

2024-04-25 22:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

只是正常运行程序


Tags: 代码命令行py程序功能add编辑参数
3条回答

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

编辑 要解决您的编辑问题

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.'

原创

看来你最好用像optpass这样的东西。但是,由于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这样的标志后跟一个值,请查看optpassehttp://docs.python.org/library/optparse.html?highlight=optparse#optparse

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

相关问题 更多 >