我正在编写一个程序,该程序将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/