我正在编写一个程序,该程序将URL列表作为参数。 (可选)我也希望能够包含一个包含其他网址列表的文件。因此,程序帮助看起来像是以下各项的组合:

usage: [-h] url [url ...]


要么

usage: [-h] --input-file file [ url [url ...]]


我目前将其编程为:

usage: [-h] [--input-file file] [url [url ...]]


其中--input-file的使用和指定至少一个url都是可选的。然后,我正在检查自己是否指定了input-file或URL列表。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-i','--input-file', help="File of urls to be read")
parser.add_argument('urls',nargs='*')
args = parser.parse_args()
if not args.input_list and not args.urls:
    parser.error('must have either an input-file or a url')


argparse中是否有一种方法可以在没有输入文件的情况下强制用户指定url,但如果有输入文件,则可以使其为可选?

最佳答案

如果指定fromfile-prefix-chars(例如@),则用户可以指定一个文件来读取这些url。读取该文件的行并将其添加到sys.argv中,就像在命令行中键入它们一样。

http://docs.python.org/dev/library/argparse.html#fromfile-prefix-chars

parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('urls',nargs='+')  # require 1 or more url
args = parser.parse_args()


所有这些工作(其中urls.txt每行有一个url字符串)

parser.parse_args('four.txt'.split())
parser.parse_args('@urls.txt four.txt'.split())
parser.parse_args('@urls.txt'.split())


而没有文件或网址给出错误

parser.parse_args(''.split())


默认的help并没有说明允许该@url.txt文件名的任何内容,但是您可以在自定义描述字符串中添加它。

PS-您的argparse后测试比您在argparse中指定的任何测试都要简单。必需的包含-i参数和位置的互斥组可能有用,但它所做的只是您的测试而已。我之所以写“可能”,是因为我必须加倍“ *”位置是否适用于此类人群。但这是我所见过的第一个案例,其中fromfile_prefix_chars选项真正有用。

关于python - argparse中的条件可选标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20891068/

10-14 18:18
查看更多