最近用python当中的命令行参数模块click写一个脚本,但是疯狂报错,焦头烂额之后终于找到了原因,在此做一个记录。
脚本内容如下
因为自己写的脚本很复杂,这里用click模块的官方demo作为例子。
import click
@click.command()
@click.argument('Name')
def hello(Name):
print('Hello %s!' % Name)
if __name__ == '__main__':
hello()
报错如下
$python3 hel.py world
Traceback (most recent call last):
File "", line 9, in <module>
hello()
File "/Software/Anaconda4.4_py3.6/lib/python3.6/site-packages/click/", line 722, in __call__
return self.main(*args, **kwargs)
File "/Software/Anaconda4.4_py3.6/lib/python3.6/site-packages/click/", line 697, in main
rv = self.invoke(ctx)
File "/Software/Anaconda4.4_py3.6/lib/python3.6/site-packages/click/", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Software/Anaconda4.4_py3.6/lib/python3.6/site-packages/click/", line 535, in invoke
return callback(*args, **kwargs)
TypeError: hello() got an unexpected keyword argument 'name'
看到这个错误,一直好奇为什么脚本里面使用的是Name,为什么报错是不期望的参数name?
TypeError: hello() got an unexpected keyword argument 'name'
解决
经过一番疯狂乱改之后,最后终于找到了解决方法。
把脚本里面定义的参数,从大写Name改成name,问题就顺利解决啦!
import click
@click.command()
@click.argument('name')
def hello(name):
print('Hello %s!' % name)
if __name__ == '__main__':
hello()
$python3 hel.py world
Hello world!
我不太确定是因为click模块不支持大写的变量参数吗,只要把参数名字改成小写就没有问题了。
又或者是click模块里面的某个参数是我不知道的,可以避免这种情况?
(由于时间和水平有限,如有纰漏,欢迎指正。)