如何在 Python 中使用 argparse 传递 Shell 脚本样式参数

Posted

技术标签:

【中文标题】如何在 Python 中使用 argparse 传递 Shell 脚本样式参数【英文标题】:How to make Shell script style arguments passing with argparse in Python 【发布时间】:2021-02-28 10:39:32 【问题描述】:

我有一个 python 解析参数,如下所示:

代码:

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Args test')
    parser.add_argument('-myarg1', '--myarg1', type=str, dest='myarg1', required=True, help='Help yourself')
    parser.add_argument('-myarg2', '--myarg2', type=str, dest='myarg2', default=' ', help='Help yourself')

    args = parser.parse_args()
    print(args.myarg1)
    print(args.myarg2)

如果我像下面这样调用脚本,上面的工作:

python myargs.py -myarg1 something -myarg2 somethingelse

但是如果我这样称呼它就行不通了:

python myargs.py -myarg1 something -myarg2

显然会引发以下错误,因为它希望调用者为第二个参数传递值。

usage: myargs.py [-h] -myarg1 MYARG1 [-myarg2 MYARG2]
myargs.py: error: argument -myarg2/--myarg2: expected one argument

问题: 我理解上面python抱怨它的原因。但是,我希望我的 python 脚本的用户能够调用第二个参数,只需说出 -myarg2--myarg2 而无需指定类型。就像 shell 脚本风格一样。 argparse可以做到吗?

我正在使用 python 2.7 及更高版本。

【问题讨论】:

myarg2的期望值类型是什么? 我更新了值类型。它的海峡。两个参数都是字符串类型 【参考方案1】:

这是可能的。您可以使用action="store_true" 属性将参数转换为布尔值(标志)。

parser.add_argument('-myarg2', '--myarg2', dest='myarg2', action="store_true", help='Help yourself')
args = parser.parse_args()
print(args.myarg2) # True if "python myargs.py -myarg2", False if "python myargs.py"

编辑

如果您希望用户能够将可选参数传递给myarg2 标志,则需要使用nargs='?' 属性。您还需要定义一个default 属性,如果不使用该标志将被调用,以及一个const 属性,如果该标志被使用但不带参数将被调用。

parser.add_argument('-myarg2', '--myarg2', dest='myarg2', nargs='?', const="no value", default='no flag', help='Help yourself')

【讨论】:

但是如果她想传递一个 str 参数,这将导致错误 确实,我已经修改了我的答案来处理这个案例【参考方案2】:

问题是您调用参数标志时没有值。如果您希望该值是空字符串,请执行 -

python myargs.py -myarg1 something -myarg2 ' '

【讨论】:

我知道我可以通过''或''。它有效,但我想避免它【参考方案3】:

如果您想使用 --myarg 并将其解释为 true(否则为 false),您需要使用

parser.add_argument("-myarg2", "--myarg2", action="store_true")

【讨论】:

但是如果她想传递str 参数,这将导致错误 @Lior Cohen 好点。奇怪的是python没有提供传递字符串或不传递字符串的方法。但如果这是 python 中的约束,那么我将不得不忍受它。 好的。就一个问题。 action='store_false' 让它为假? 如何检查用户是否通过了输入? @AdeleGoldberg 实际上,action="store_false" 将使其为 false,action="store_const" 将使其成为 const 属性的值。你可以了解更多here

以上是关于如何在 Python 中使用 argparse 传递 Shell 脚本样式参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 argparse 将参数发送到 Python 脚本中的函数

使用 argparser 将参数传递给入口点 python 脚本

使用 argparse 将 Shell 参数传递给 Boto3 Python

从 subprocess.Popen 将参数传递给 argparse

如何将 kwargs 传递给 argparse

python常用模块 argparse