我想有以下语法:
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开始interprete它的位置,而不是可选参数......
换句话说,就是可以明确告诉argparse参数是可选的还是位置,这样我可以有不含破折号可选参数?
有没有办法让argparse
为你做到这一点。 但是,你可以让argparse
接受任何数目的位置参数:
parser.add_argument('FILES',nargs='*')
options=parser.parse_args()
file1,optional_files=options.FILES[0],options.FILES[1:]
当然,你可能需要添加一些检查,以确保至少1文件下达,等
编辑
我还没有100%确定你想要的这里,但如果file1
和file2
的文本字符串,就可以解决,通过预处理一点点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)
另一个例子是:
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
而且,按升序
有同样的问题。 我的解决方法是:
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()