Argparse: объект str не имеет атрибута - PullRequest
0 голосов
/ 07 апреля 2020

Не уверен, что здесь происходит. Передача 2 аргументов в argparser, получение ошибки. Я неправильно передаю свои аргументы?

Вот код, который я запускаю.

parser = argparse.ArgumentParser()
parser.add_argument('-dspath', '--datasheet-path', required=True, dest='datasheet_path', type=str, help='path to data')
parser.add_argument('-pname', '--project-name', required=True, dest='project_name', type=str, help='name of project')
args = parser.parse_args("./path_to_project", "name_of_project")

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "/Users/ayoung/PycharmProjects/pdf_scraper_atul/datasheet_rms_comparator 3.py", line 1320, in <module>
    args = parse_args()
  File "/Users/ayoung/PycharmProjects/pdf_scraper_atul/datasheet_rms_comparator 3.py", line 26, in parse_args
    args = parser.parse_args("./path_to_project", "name_of_project")
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py", line 1749, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py", line 1772, in parse_known_args
    setattr(namespace, action.dest, action.default)
AttributeError: 'str' object has no attribute 'datasheet_path'

Спасибо!

Ответы [ 4 ]

1 голос
/ 07 апреля 2020

Поскольку argparse не принимает никаких позиционных аргументов, вы должны включить --flags, чтобы указать argparse, где искать аргументы.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-dspath', '--datasheet-path', required=True, dest='datasheet_path', type=str, help='path to data')
parser.add_argument('-pname', '--project-name', required=True, dest='project_name', type=str, help='name of project')
args = parser.parse_args(["--datasheet-path", "./path_to_project", "--project-name", "name_of_project"])

print(args)

Запуск этого скрипта дает нам .. .

$ python parseArgs.py
Namespace(datasheet_path='./path_to_project', project_name='name_of_project')
0 голосов
/ 07 апреля 2020

Первая точка: второй аргумент parser.parse_args:

Объект для получения атрибутов. По умолчанию используется новый пустой объект Namespace.

Это объясняет вашу первую ошибку (строки неизменны, вы не можете устанавливать для них атрибуты).

Вторая точка: префиксами имен аргументов "-" , вы делаете их именованными аргументами, поэтому вы должны передавать их как таковые, а не как позиционные аргументы.

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

Да, вы передаете их неправильно. Они должны быть в последовательности, как список:

args = parser.parse_args(["./path_to_project", "name_of_project"])

Спасибо Энтони Соттиле за указание на это в комментарии

Причина этой ошибки: parse_args ожидает, что ее второй аргумент будет пространством имен . Из документации :

ArgumentParser.parse_args(args=None, namespace=None)

Преобразуйте строки аргументов в объекты и назначьте их в качестве атрибутов пространства имен.


Однако, затем вы получите еще одну ошибку:

usage: test.py [-h] -dspath DATASHEET_PATH -pname PROJECT_NAME
test.py: error: the following arguments are required: -dspath/--datasheet-path, -pname/--project-name

, которую вы можете исправить, передав необходимые параметры:

args = parser.parse_args(["-dspath", "./path_to_project", "-pname", "name_of_project"])

или превратив ваши параметры в позиционные аргументы:

parser.add_argument('datasheet_path', help='path to data')
parser.add_argument('project_name', help='name of project')
args = parser.parse_args(["./path_to_project", "name_of_project"])
print(args)
# Namespace(datasheet_path='./path_to_project', project_name='name_of_project')

КСТАТИ type=str подразумевается, и я изменил имена аргументов, чтобы подчеркивания вместо черточек.

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

заменить datasheet_path на datasheet-path

...