如何在 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_true
与 positional
没有意义。
使用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_1
和args.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 等选项的主要内容,如果未能解决你的问题,请参考以下文章