Python:argparse不带破折号的可选参数

cngwdvgl  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(114)

我希望有以下语法:

python utility.py file1 FILE1 file2 FILE2

其中file1和file2是可选参数。使用以下语法可以很简单地使其工作:

python utility.py --file1 FILE1 --file2 FILE2

使用

parser.add_argument('--file1',type=file)
parser.add_argument('--file2',type=file)

然而,如果我删除破折号,argparse开始将其解释为位置参数而不是可选参数…
换句话说,有没有可能明确地告诉argparse一个参数是可选的还是位置的,这样我就可以有没有破折号的可选参数?

qyyhg6bp

qyyhg6bp1#

没有办法让argparse为你做这件事。但是,您可以让argparse接受任意数量的位置参数:

parser.add_argument('FILES',nargs='*')
options=parser.parse_args()
file1,optional_files=options.FILES[0],options.FILES[1:]

当然,您可能希望添加一些检查,以确保至少提供了1个文件,等等。

编辑

我仍然不能100%确定您想要什么,但是如果file1file2是文字字符串,您可以通过预处理sys.argv来解决这个问题。当然,这仍然会使你的帮助信息的格式变得奇怪,但是你总是可以添加一个后记来解释这两种形式都是可以的:

import argparse
import sys

mangle_args=('file1','file2')
arguments=['--'+arg if arg in mangle_args else arg for arg in sys.argv[1:]]

parser=argparse.ArgumentParser()
parser.add_argument('--file1')
parser.add_argument('--file2')
options=parser.parse_args(arguments)
py49o6xq

py49o6xq2#

另一个例子是:
train.py

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Arguments for wake_word")
    parser.add_argument('data', type=str, help="path to data")
    parser.add_argument('output', type=str, help="model save path")
    parser.add_argument('batch_size', type=int, help="batch size")
    parser.add_argument('epochs', type=int, help="no.s of epochs")
    args = parser.parse_args()
print(args.data + args.output + args.batch_size + args.epochs)

然后你可以只运行这段代码,参数不带破折号

train.py /path/to/data/ /path/to/output_files/ 128 100

按升序排列

c3frrgcw

c3frrgcw3#

有同样的问题。我的解决方法是:

lastarg = sys.argv[-1]
if len(sys.argv) > 1 and lastarg[0] != '-':
    sys.argv[-1] = '-file'
    sys.argv.append(lastarg)

argparser = argparse.ArgumentParser()
argparser.add_argument('-d', action='store_true')
argparser.add_argument('-nrv', action='store_true')
argparser.add_argument('-file', type=str, default='')
args = argparser.parse_args()

相关问题