【问题标题】:How do i achieve the below functionality using argparse?如何使用 argparse 实现以下功能?
【发布时间】:2018-02-14 14:47:54
【问题描述】:


我想让我的 python 脚本如下所示:

  • example.py -a 数字
  • example.py -a -f 输入文件

所以第一个命令应该只取一个数字并执行一些操作。
但是第二个命令应该从文件(.txt)中获取数字并执行相同的操作

例如:
-a number 选项读取数字并打印到屏幕
-a -f inputfile 也应该读取数字并打印到屏幕,但来自 .txt 文件(可以有多个数字)

有可能吗?
如果没有,请提出一个最好的方法。 谢谢

【问题讨论】:

  • 为什么第二种情况需要 -a ? -f 应该足够了。
  • 因为脚本也做了其他事情,所以我想通过使用 -a 来区分这个功能。但我想要两种不同的输入方式
  • 你可以设置nargs=?当为 -a 调用 add_argument 时
  • 你的意思是,如果我用 nargs= 做 -a?它可以将数字或文件作为输入?
  • 是的。 -a 可以有 0 或 1 个参数值。使用默认值检查用户是否提供了值。

标签: python-3.x argparse


【解决方案1】:

用户的角度来看,您的想法没有意义。

含义:当你说-f时,用户已经明白该工具将打开相应的文件并处理它。因此,您不应该要求他在此基础上提供-a

但你当然可以做到。我会在这里做什么:为-a 开关提供一个默认 值,例如here

然后您的脚本可以检查是否使用了该 default 值。然后你可以根据它做出决定,比如:

  • 如果-a 有它的默认值并且给定了-f:从文件中读取并做-a 应该做的事情
  • 如果-a 没有默认值并且-f 被给出: ??? (你必须想出这意味着什么)
  • ...

那些......是我认为你的方法不优雅的一个症状:它确实使整个论点处理变得非常复杂。我会选择-a NUMBER -f filenot 允许混合使用。你看,任何界面都应该容易做正确的事,而困难做错事。允许标志/开关的组合 只会导致可能路径的爆炸式增长。这意味着您必须处理所有这些,并且用户必须记住那些实际上是有效的。

并给出您的评论:当然,您可以将其统一为让-a 采用要么 一个数字或一个表示文件名的字符串。

然后您只需指示 argparse -a 存储 string 值。然后您的脚本可以决定该字符串是数字还是有效的文件名。然后做必要的事情。像这样的:

from __future__ import print_function
import os.path
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-a", "--add",
                    help="whatever",
                    type=str)
args = parser.parse_args()

if args.add:
    if args.add.isdigit():
        print("input contains only digits: {}".format(args.add))
    else:
        print("input contains other stuff: {}".format(args.add))
        if os.path.isfile(args.add):
            print("input is a valid file name!")

【讨论】:

  • 哦!谢谢你详细解释
  • 当然!一个快速的问题,一个选项可以从命令行和文件中获取值吗?我的意思是,在我的情况下 - 我可以只使用 -a,用户可以从命令行输入数字或为文件提供所有数字?
  • 如果你能举个小例子——那真是太棒了。因为我有点不确定我的函数应该如何知道输入是来自命令行还是来自文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2010-12-29
  • 2018-06-10
  • 2023-04-07
相关资源
最近更新 更多