объединение argsparse и sys.args в Python3 - PullRequest
0 голосов
/ 23 апреля 2020

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

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

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Ошибка здесь вызвана синтаксическим анализатором 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 соответственно.

0 голосов
/ 23 апреля 2020

Вход по умолчанию для 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'], нераспознанными аргументами, которые вы можете назначить своим двум переменным.

Парсеры (обычно) не потребляют и не изменяют sys.argv. Таким образом, несколько парсеров (argparse или других) могут читать один и тот же sys.argv. Но чтобы это работало, они должны прощать строки, которые им не нужны или не распознаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...