为啥即使我写得正确,argparse 也不起作用并发送无效选项错误消息?
Posted
技术标签:
【中文标题】为啥即使我写得正确,argparse 也不起作用并发送无效选项错误消息?【英文标题】:Why doesn't argparse work and send invalid option error message even if i wrote correctly?为什么即使我写得正确,argparse 也不起作用并发送无效选项错误消息? 【发布时间】:2019-10-09 04:49:59 【问题描述】:当我正确使用 argparse 时出现无效选项字符串错误(来自 python 教育网站的示例文件)。
我尝试更改输入和输出文件的路径以及路径中的\ -> /或\等符号
原来的代码是
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True,
help="path to input image")
ap.add_argument("-o", "--output", required=True,
help="path to output image")
args = vars(ap.parse_args())
我更改了参数--input 和--output -> 输入和输出文件的路径。
ap = argparse.ArgumentParser()
ap.add_argument("-i", "C:\input_01.png", required=True,
help="path to input image")
ap.add_argument("-o", "C:\output_011.png", required=True,
help="path to output image")
args = vars(ap.parse_args())
我收到了这个错误信息。
Traceback (most recent call last):
File "C:/Users/command-line-arguments/shape_counter.py", line 13, in
<module>
help="path to input image")
File "C:\Users\huryo\Anaconda3\lib\argparse.py", line 1339, in add_argument
kwargs = self._get_optional_kwargs(*args, **kwargs)
File "C:\Users\huryo\Anaconda3\lib\argparse.py", line 1470, in _get_optional_kwargs
raise ValueError(msg % args)
ValueError: invalid option string 'C:\\input_01.png': must start with a character '-'
【问题讨论】:
你是如何调用你的python脚本的?看起来您需要在C:\\input_01.png
之前添加 -i 或 -o。例如python shape_counter.py -i C:\input_01.png -o C:\outpunt_011.png
原始代码中的 --input
和 --output
字符串是参数的长形式。我不知道你希望通过用文件名替换它们来完成什么。
我更改了代码,因为我收到了另一条错误消息。错误:需要以下参数:-i/--input,-o/--output 所以我尝试给出确切的文件名,以便它至少可以工作。
您收到该错误是因为您没有在命令行中提供任何值。这是在解析时提出的。新的错误发生在构造解析器时,在实际解析之前。 add_argument
不是设置值的地方(可能的默认值除外)。
很少使用required=True
作为选项。如果需要一个值,请考虑将其作为参数,而不是选项。
【参考方案1】:
arg_parse.addargument()
的第二个位置参数是用于引用变量的名称的长版本,因此 -i
将是 --input
,如果您需要使用 default=...
参数希望它有一个默认值。您应该将代码改回:
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True,
help="path to input image")
ap.add_argument("-o", "--output", required=True,
help="path to output image")
args = vars(ap.parse_args())
或者,如果您想要 -i
和 -o
的默认值,您可以使用 argparser 的默认参数:
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", default="C:\input_01.png",
help="path to input image")
ap.add_argument("-o", "--output", default="C:\output_011.png",
help="path to output image")
args = vars(ap.parse_args())
然后使用命令行参数从命令行调用它:
python shape_counter.py -i C:\input_01.png -o C:\output_011.png
【讨论】:
我尝试使用原始代码运行,但出现另一个问题:错误:需要以下参数:-i/--input, -o/--output @YouHur,原始代码确实指定这些值为required
,不是吗?顺便问一下,你知道如何在命令行中提供值吗?
@YouHur 你是从命令行运行这个吗?从不同的脚本调用它?您是否按照我在帖子中所说的方式运行它(包括 -i 和 -o 参数)?请发布您在终端中运行的命令的方式。
@MasonCaiby 我尝试在 Pycharm 中运行它。如果我给出命令,它可以在 CMD 中工作:)
不,我在 pycharm 中仍然收到错误消息 :( 这就是问题所在。以上是关于为啥即使我写得正确,argparse 也不起作用并发送无效选项错误消息?的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?
为啥即使我在项目设置中更改了语言标准,std::lcm() 也不起作用?
为啥即使包含所有脚本引用,我的 jQuery-UI 对话框也不起作用?
为啥即使我在 Ubuntu 12.10 上安装了 git 1.8.3.2,`git subtree` 也不起作用?