Я пытаюсь написать инструмент командной строки для 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] соответственно?

И будет ли работать по умолчанию так, как я ожидаю, если поля и разделитель не указываются в командной строке?

0
David J. 23 Апр 2020 в 10:54

2 ответа

Лучший ответ

Ошибка здесь вызвана синтаксическим анализатором argparse, который не может воспринять часть команды 'b' 'aj.org', и ваш код никогда не достигает строк с sys.argv. Попробуйте добавить эти аргументы в argparse и избегайте одновременного использования argparse и sys.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.name и args.org_src соответственно.

2
Phil Filippak 23 Апр 2020 в 08:04

Вход по умолчанию для parser.parse_args - sys.argv[1:].

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

Сообщение об ошибке было напечатано argparse с последующим выходом sys.

Сообщение означает, что в 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. Но чтобы это работало, они должны прощать строки, которые им не нужны или не распознаются.

0
hpaulj 23 Апр 2020 в 16:04