使用argparse在命令行中打印参数?

49

我正在使用argparse来解析命令行参数。

为了帮助调试,我想要print一行包含Python脚本被调用时的参数。在argparse中有没有简单的方法可以实现这个需求?

3个回答

51

ArgumentParser.parse_args 默认从 sys.argv 中获取参数。因此,如果您不更改该行为(通过传递其他内容给 parse_args),则可以简单地打印 sys.argv 以获取传递给 Python 脚本的所有参数:

import sys
print(sys.argv)

或者,您也可以直接打印parse_args返回的名称空间;这样,您就可以以参数解析器解释它们的方式获取所有值:

args = parser.parse_args()
print(args)

如果 parser.parse_args() 需要必填参数,则此方法无效。在这种情况下是否有替代方法? - Conchylicultor

30
如果在另一个Python脚本中(例如在unittest中)运行argparse,那么打印sys.argv将仅打印主脚本的参数,例如:

['C:\eclipse\plugins\org.python.pydev_5.9.2.201708151115\pysrc\runfiles.py', 'C:\eclipse_workspace\test_file_search.py', '--port', '58454', '--verbosity', '0']

在这种情况下,您应该使用vars来迭代argparse args:

parser = argparse.ArgumentParser(...
...
args = parser.parse_args()
for arg in vars(args):
    print arg, getattr(args, arg)

感谢:https://dev59.com/uV4d5IYBdhLWcg3wFPQ7#27181165


我会使用类似以下的打印调用: print(' {} {}'.format(arg, getattr(args, arg) or '')) 其中 getattr(args, arg) or '' 是与你版本的主要区别,它可以防止在未使用可选参数的情况下打印出单词“None”。 - Bastian

15
您可以通过调用vars(args)将参数作为dict获取,然后您可以迭代dict的键值对。
args = parser.parse_args()
print(' '.join(f'{k}={v}' for k, v in vars(args).items()))

2
vars can be replace by __dict__. for k, v in args.__dict__.items():print(f"{k}: {v}") ` - haofeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接