为啥即使我写得正确,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` 也不起作用?

Spring Security - 即使凭据正确,身份验证也不起作用

为啥即使我能够获得对我试图滚动到的元素的引用,scrollIntoView 在 Vue 3 中也不起作用