【问题标题】:combining argsparse and sys.args in Python3在 Python3 中结合 argparse 和 sys.argv
【发布时间】:2020-08-06 11:20:32
【问题描述】:

我正在尝试为 Python 编写一个可以像这样运行的命令行工具..

orgtoanki 'b' 'aj.org' --delimiter="~" --fields="front,back"

这是脚本:

#!/usr/bin/env python3
import sys
import argparse

from orgtoanki.api import create_package

parser = argparse.ArgumentParser()
parser.add_argument('--fields', '-f', help="fields, separated by commas", type=str, default='front,back')
parser.add_argument('--delimiter', '-d', help="delimiter", type= str, default='*')
args = parser.parse_args()
name=sys.argv[1]
org_src=sys.argv[2]

create_package(name, org_src, args.fields, agrs.delimiter)

当我运行它时,我收到以下错误:

usage: orgtoanki [-h] [--fields FIELDS] [--delimiter DELIMITER]
orgtoanki: error: unrecognized arguments: b aj.org

为什么 'b' 和 'ab.org' 不被分别解释为 sys.argv[1]sys.argv[2]

如果没有向命令行提供字段和分隔符,默认设置是否会按我的预期工作?

【问题讨论】:

  • Argparse 不知道您自己对 sys.argv 做了什么,或者这消除了它处理这些部分的责任。你为什么不也通过 argparse 获取两个位置参数?
  • 换种说法,既然你问“为什么不?”:请澄清为什么你认为 argparse 应该知道手动处理 args 1 和 2(尤其是在解析之后)?
  • @MisterMiyagi 我实际上并不认为 argparse 应该知道 sys.arg 处理位置参数。也许问题标题让你这么想。例如,我不是在问为什么 argparse 不将 b 解释为 argparse 变量。
  • 那么问题是什么?目前,它指出“为什么不将'b'和'ab.org'分别解释为sys.argv[1]和sys.argv[2]?”。唯一不能“正确”解释 sys.argv[1] 和 sys.argv[2] 的是 argparse,因此会抛出错误。

标签: python command-line-interface argparse


【解决方案1】:

这里的错误是由argparse 解析器导致的,它无法理解命令的'b' 'aj.org' 部分,并且您的代码永远不会到达sys.argv 的行。尝试将这些参数添加到 argparse 并避免同时使用 argparsesys.argv

parser = argparse.ArgumentParser()

# these two lines
parser.add_argument('name', type=str)
parser.add_argument('org_src', type=str)

parser.add_argument('--fields', '-f', help="fields, separated by commas",
                    type=str, default='front,back')
parser.add_argument('--delimiter', '-d', help="delimiter",
                    type= str, default='*')

args = parser.parse_args()

然后您可以分别在args.nameargs.org_src 访问它们的值。

【讨论】:

    【解决方案2】:

    parser.parse_args 的默认输入是sys.argv[1:]

    usage: orgtoanki [-h] [--fields FIELDS] [--delimiter DELIMITER]
    orgtoanki: error: unrecognized arguments: b aj.org
    

    错误消息由argparse 打印,然后是系统退出。

    该消息表示它在sys.argv[1:] 中找到了未被编程识别的字符串。您只告诉它“--fields”和“--delimiter”标志。

    您可以按照其他人的建议添加两个位置字段。

    或者你可以使用

    [args, extras] = parser.parse_known_args()
    name, org_src = extras
    

    extras 应该是一个列表['b', 'aj.org'],即无法识别的参数,您可以将其分配给您的 2 个变量。

    解析器(通常)不会使用和修改sys.argv。所以几个解析器(argparse 或其他)可以读取相同的sys.argv。但要使其发挥作用,他们必须宽容他们不需要或不认识的字符串。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2016-05-23
      • 2018-06-24
      • 2012-08-31
      • 2015-07-09
      • 2020-03-21
      • 2021-08-01
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多