如何在 parser.add_argument 中使用 1、2、3 等选项

Posted

技术标签:

【中文标题】如何在 parser.add_argument 中使用 1、2、3 等选项【英文标题】:How do I use options like 1, 2,3 with parser.add_argument 【发布时间】:2021-10-20 10:34:15 【问题描述】:

我正在编写一个脚本来根据参数调用不同的 python 脚本。 Argparser 不允许我更改为只给出 1。

目前我正在使用带有 -option1 的 argparser,但想作为 $script.py 1 运行

当前运行方式

$script.py -option1

想用

$script.py 1

我的代码:-

import argparse


def main():
    parser = argparse.ArgumentParser()
    #parser.add_argument('1', action='store_true')
    parser.add_argument('-option1', default=None, action='store_true',   help="This runs hello-1.py") # want to use '1' insted of '--option1'
    parser.add_argument('-option2', action='store_true', default=None, help="This runs hello-2.py")
    parser.add_argument('-option3', action='store_true', default=None, help="This runs hello-3.py")

    #parser.add_argument('-l', action='store_true')

    args = parser.parse_args()
    if args.option1:  #want to use args.1 here but won't allow
            with open("hello-1.py", "r") as file:
                    exec(file.read())
    elif args.option2:
            with open("hello-2.py", "r") as file:
                    exec(file.read())
    elif args.option3:
            with open("hello-3.py", "r") as file:
                    exec(file.read())
    else:
            print("Invalid argument")
    file.close()
    return args

if __name__ == '__main__':
        main()

#if args.l:
#        print("List files within config")

请推荐

【问题讨论】:

你想要的实际上是不可能的。 1 是一个 positional 参数,而不是一个选项。您可以将其设为可选,但不能使其在参数列表中的位置发生变化。如果你先定义它,它必须是第一个位置参数。 store_truepositional 没有意义。 使用store_true时不要设置default。该操作将默认设置为False,使用时设置为True 【参考方案1】:

您似乎真的很困惑,而您真正想要的是一个位置参数和一组有限的choices,它允许您选择要运行的脚本。我们就叫它script吧。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('script', choices=['1', '2', '3'])
args = parser.parse_args()
print(args)

示例用法:

$ ./tmp.py 1
Namespace(script='1')

$ ./tmp.py 2
Namespace(script='2')

$ ./tmp.py 3
Namespace(script='3')

$ ./tmp.py 4
usage: tmp.py [-h] 1,2,3
tmp.py: error: argument script: invalid choice: '4' (choose from '1', '2', '3')

$ ./tmp.py 
usage: tmp.py [-h] 1,2,3
tmp.py: error: the following arguments are required: script

$ ./tmp.py 1 2
usage: tmp.py [-h] 1,2,3
tmp.py: error: unrecognized arguments: 2

顺便说一句,您还可以改进选择要打开和运行的文件的代码,例如:

fnames = 
    '1': 'hello-1.py',
    '2': 'hello-2.py',
    '3': 'hello-3.py',
    

...
parser.add_argument('script', choices=fnames.keys())
...

fname = fnames[args.script]
with open(fname) as file:
    exec(file.read())

【讨论】:

感谢 Wjandrea!让我试试这个。 这对我来说效果很好,非常感谢 Wjandrea!【参考方案2】:

您可以在没有 action 的情况下创建参数,例如:

    parser.add_argument("1")
    parser.add_argument("2")

但这会使它们成为位置参数,并且每次执行脚本时都必须将值传递给它们。

我认为您最好的选择,也更适合您的目的,是创建可选参数,例如:

    parser.add_argument("--hello-1", action="store_true")
    parser.add_argument("--hello-2", action="store_true")

您可以在代码中使用args.hello_1args.hello_2 引用它们

【讨论】:

试过 #parser.add_argument('1', action='store_true') 这不起作用 这样做是创建一个不带值的位置参数。它有效地防止您传递任何位置参数,但无条件地将目标"1" 设置为值True argparse 根本不是为了适应没有前缀的选项而构建的。【参考方案3】:

我认为你能得到的最接近的是位置参数,其值的选择数量有限。

p.add_argument("1", nargs='?', choices=["1"])

(尽管将名称命名为 "one" 或其他有效标识符可能会更简单,以便更轻松地使用生成的 Namespace)。

以下是合法的

script.py 1
script.py

以下将被拒绝

script.py 2

这样做的最大缺点是,如果您有多个位置参数,需要1 设为调用中的第一个位置参数。没有办法(据我所知)使用 argparse 创建一个没有前缀的真正选项。

【讨论】:

【参考方案4】:

如果我猜对了,你需要这样的东西。

输入:

 python scratch.py 1 2 3 4

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')


args = parser.parse_args()
print(args.integers)

输出:

[1, 2, 3, 4]

来自https://docs.python.org/3/library/argparse.html

【讨论】:

只有一个参数,它只是一个数字(仅限数字)$script.py 1【参考方案5】:

您想使用位置参数。 AFAIK Python 根据GNU/POSIX 区分参数。 要使用位置参数,您需要去掉 ---。 例如。采用 parser.add_argument('option')

编辑:从add_argument 中删除action=store_true。这与选项有关(可选参数会将option 设置为 True 如果存在)。

【讨论】:

这不需要或消耗参数;它只是在结果命名空间中设置option=True

以上是关于如何在 parser.add_argument 中使用 1、2、3 等选项的主要内容,如果未能解决你的问题,请参考以下文章

parser.add_argument()用法——命令行选项参数和子命令解析器

flask_restful

pyhon 实现图片转换成字符画

python 画图

argparse

python 图片转字符画