Python Argparse:str对象没有属性

Python Argparse:str对象没有属性,python,python-3.x,argparse,Python,Python 3.x,Argparse,不知道这里发生了什么。将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', '--proje

不知道这里发生了什么。将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'
回溯(最近一次呼叫最后一次):
文件“/Users/ayoung/PycharmProjects/pdf_scraper_atul/datasheet_rms_comparator 3.py”,第1320行,in
args=parse_args()
文件“/Users/ayoung/PycharmProjects/pdf_scraper_atul/datasheet_rms_comparator 3.py”,第26行,在parse_args中
args=parser.parse_args(“./path_to_project”,“name_of_project”)
parse_args中的文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py”,第1749行
args,argv=self.parse\u known\u args(args,名称空间)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py”,第1772行,位于parse\u known\u args中
setattr(名称空间,action.dest,action.default)
AttributeError:“str”对象没有“数据表路径”属性

谢谢

数据表路径
替换为
数据表路径

是的,您传递它们的方式不正确。它们应按顺序排列,如列表:

args = parser.parse_args(["./path_to_project", "name_of_project"])
感谢您在中指出这一点

该错误的原因是
parse_args
希望其第二个参数是命名空间。发件人:

将参数字符串转换为对象,并将其指定为命名空间的属性


但是,您会遇到另一个错误:

用法:test.py[-h]-dspath数据表\u路径-pname项目\u名称
test.py:错误:需要以下参数:-dspath/--数据表路径,-pname/--项目名称
您可以通过传递所需选项来修复此问题:

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
是隐含的,我将参数名称改为带下划线而不是破折号。

由于
argparse
不带任何位置参数,您必须包含
--标志来告诉
argparse
在哪里查找参数

import argparse
parser=argparse.ArgumentParser()
parser.add_参数('-dspath','-datasheet path',required=True,dest='datasheet_path',type=str,help='path to data')
parser.add_参数('-pname','-project name',required=True,dest='project_name',type=str,help='project name')
args=parser.parse_args([“--datasheet path”、“/path_to_project”、“--project name”、“项目名称”])
打印(args)
运行此脚本将为我们提供

$python parseArgs.py
命名空间(数据表\u路径='。\u到\u项目的路径,'project\u name='name\u of \u project')
第一点:是:

获取属性的对象。默认值是一个新的空命名空间对象

这解释了您的第一个错误(字符串是不可变的,您不能对其设置属性)


第二点:,你把它们命名为参数,所以你必须这样传递它们,而不是作为位置参数。

是的,parse_args接受一个序列,而不是位置参数,所以
parse_args(('a','b'))
parse_args(['a','b')
而不是
parse_args('a','b'))
@AndrewYoung您不应该将任何参数传递到
parse_args
。传递到
parse_args
的内容是命令行参数,如果您想从命令行(
sys.argv[1://code>)进行解析,您将调用
parse_args()
不带参数您已经定义了解析器以获取由名称
-dspath
/
--datasheet path
-pname
/
--project name
表示的参数,但不传递这些名称。@andrewyong如果您已经有了路径和名称,为什么首先要将它们发送到arparse?
argparse
在获取位置参数方面没有问题。但是,它们必须这样添加。@Mistermiagi,这就是为什么我说“
argparse
不接受任何位置参数”,而不是
argparse
不能接受位置参数;)
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')