Je ne sais pas ce qui se passe ici. Passer 2 arguments à un argparser, obtenir une erreur. Suis-je en train de transmettre mes arguments de manière incorrecte?

Voici le code que j'utilise.

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")

J'obtiens l'erreur suivante:

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'

Merci!

-1
Andrew Young 7 avril 2020 à 18:49

4 réponses

Meilleure réponse

Comme argparse ne prend aucun argument positionnel, vous devez inclure le --flags pour indiquer à argparse où chercher les arguments.

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)

L'exécution de ce script nous donne ...

$ python parseArgs.py
Namespace(datasheet_path='./path_to_project', project_name='name_of_project')
1
SpaceKatt 7 avril 2020 à 16:04

Remplacer datasheet_path par datasheet-path

-4
Nikos Hidalgo 7 avril 2020 à 17:17

Premier point: le deuxième argument de parser.parse_args est:

Un objet pour prendre les attributs. La valeur par défaut est un nouvel objet namespace vide.

Ce qui explique votre première erreur (les chaînes sont immuables, vous ne pouvez pas leur attribuer d'attributs).

Deuxième point: en préfixant les noms de vos arguments par "-", vous leur faites des arguments nommés, vous devez donc les passer comme tels, pas comme arguments positionnels.

0
bruno desthuilliers 7 avril 2020 à 16:05

Oui, vous les passez incorrectement. Ils doivent être dans une séquence, comme une liste:

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

La raison de cette erreur est que parse_args s'attend à ce que son deuxième argument soit un espace de noms . Depuis la documentation:

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

Convertissez des chaînes d'arguments en objets et affectez-les en tant qu'attributs de l'espace de noms.

Merci à Anthony Sottile d'avoir signalé cela dans un commentaire


Cependant, vous obtenez une autre erreur:

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

Que vous pouvez corriger en passant les options requises:

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

Ou en transformant vos options en arguments positionnels:

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')

BTW type=str est implicite et j'ai changé les noms d'arguments pour qu'ils soient soulignés au lieu de tirets.

0
wjandrea 7 avril 2020 à 16:36