使用不需要指定输出文件名的可选参数运行 argparse

mdi*_*002 1 python arguments optional-arguments argparse

我已经通读了一堆已经回答的问题,但我没有看到这一点——至少我没有意识到。

我正在使用 argparse 来获取一个文件并将其转换为不同的类型。输入文件名是必需的。输出文件名不是必需的,因为可选参数应该处理它。这是到目前为止的代码:

import sys
import argparse
parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('--json', type=str, help='Converts to json format')
parser.add_argument('--bibtex', type=str, help='Converts to bibtex format')
parser.add_argument('--html', type=str, help='Converts to html format')
parser.add_argument('inputfilename', type=str, help='enter the original filename')
args = parser.parse_args()
filename=args.filename
if args.json:
    print('Converting to json ...')
    #conversion code here
elif args.bibtex:
    print('Converting to bibtex ...')
    #conversion code here
elif args.html:
    print('Converting to html ...')
    #conversion code here
else:
    print('No conversion type indicated')
Run Code Online (Sandbox Code Playgroud)

问题是,每当我使用这些标志之一。如果我做

$ ./orsconvert.py --json inputfilename
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息

orsconvert.py: error: the following arguments are required: inputfilename
Run Code Online (Sandbox Code Playgroud)

它这样做是因为它将提供的解释inputfilename为连接到--json. 它试图强迫我在可选参数之后和输入文件名之前实际声明输出文件名,类似于:

$ ./orsconvert.py --json outputfilename inputfileneame
Run Code Online (Sandbox Code Playgroud)

但是,如果有办法解决它,我不想这样做。我希望它接受--json作为要做什么的指示,然后inputfilename用作输入并outputfilename根据代码将指定的内容自动保存它。

是的,我正在考虑将 3 个可选参数作为一组来简化代码......但这仍然没有解释如何让它在可选参数之后和最终inputfilename必需参数之前不需要另一个参数。

我可以在该parser.add_argument('...')字段中添加其他内容来停止要求我指定一个outputfilename? 我想尽可能少地更改代码,因为我已经在挑战我的编码理解的极限。

che*_*ner 5

问题是您定义--json为需要一个参数,并且它将输入文件名作为该参数。您的三个转换器应该使用该store_true操作,而不是默认store操作。

parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('--json', action='store_true', help='Converts to json format')
parser.add_argument('--bibtex', action='store_true', help='Converts to bibtex format')
parser.add_argument('--html', action='store_true', help='Converts to html format')
parser.add_argument('inputfilename', help='enter the original filename')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

通过此更改,args.json所有这些都是您期望的布尔值。该store_true操作负责定义类型bool和默认值false


更重要的是,虽然,将是必须采取的数值单所需位置参数jsonbibtexhtml。然后parse_args它自己会检测是否给出了不正确或丢失的转换类型。

parser = argparse.ArgumentParser(description='Convert file to new type')
parser.add_argument('inputfilename', help='enter the original filename')
parser.add_argument('conversion_type', choices=['json', 'bibtex', 'html'])
args = parser.parse_args()
filename = args.filename
conversion_type = args.conversion_type  # Guaranteed to be json, html, or bibtex
if conversion_type == "json":
    ...
elif conversion_type == "bibtex":
    ...
elif conversion_type == "html":
Run Code Online (Sandbox Code Playgroud)

如果您想要一个带有默认值的选项,请扣好 :) 我们将添加4 个选项:一个可以明确指定输出类型,以及三个用于设置它的快捷方式。

p = argparse.ArgumentParser()
p.add_argument('inputfilename')
p.add_argument('--type', choices=['json', 'bibtex', 'html'], default='json')
p.add_argument('--json', action='store_const', const='json', dest='type')
p.add_argument('--html', action='store_const', const='html', dest='type')
p.add_argument('--bibtex', action='store_const', const='bibtex', dest='type')
Run Code Online (Sandbox Code Playgroud)

--json--bibtex--html具有相同的效果--type json--type bibtex以及--type html,分别。和以前一样,--type只能将这三个值作为其参数。如果超过其中一项,则最后使用的一项生效。