python - argparse 中的条件可选标志

标签 python argparse

我正在编写一个程序,该程序采用 url 列表作为参数。或者,我还希望能够包含一个包含其他 url 列表的文件。因此,程序帮助看起来像以下内容的组合:

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

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

我目前正在将其编程为:

usage: [-h] [--input-file file] [url [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())

当没有文件或 URL 时出现错误

parser.parse_args(''.split())

默认的帮助没有说明允许使用@url.txt文件名,但您可以将其添加到自定义描述字符串中。

PS - 您的 post-argparse 测试比您在 argparse 中指定的任何内容都要简单。涉及 -i 参数和位置的必需互斥组可能会起作用,但它的作用并不比您的测试多。我写了“可能”,因为我必须加倍“*”位置是否在这样的组中起作用。但这是我第一次看到 fromfile_prefix_chars 选项真正有用的情况。

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

相关文章:

python - Vim 表格 : how to ignore long comments

python - 是否有可能是嵌套的try/except过多导致栈溢出?

python - Argparse 安装在 anaconda 4.3 for windows 中失败,使用 python 3.6(64 位)

Python:Argparse - 必需和可选参数

python - 动态添加 URL 规则到 Flask 应用

python - 从匹配值列表中删除字典

python - 是否可以使用 Python 的 argparse 重建命令行?

Python argparse : default value or specified value

python - 关于hough_line和hough_line_peaks的代码解释

python - 禁用 argparse 选择消息