处理 argparse 输入中的空格

Posted

技术标签:

【中文标题】处理 argparse 输入中的空格【英文标题】:Handle spaces in argparse input 【发布时间】:2013-08-12 00:23:45 【问题描述】:

使用python和argparse,用户可以输入带有-d标志的文件名。

parser.add_argument("-d", "--dmp", default=None)

但是,当路径包含空格时,这会失败。例如。

-d C:\SMTHNG\Name with spaces\MORE\file.csv

注意:空格会导致错误(标志只接受 'C:SMTHNG\Name' 作为输入)。

error: unrecognized arguments: with spaces\MORE\file.csv

我花了比它应该找到解决这个问题的时间更长的时间...... (没有找到问答,所以我自己发帖)

【问题讨论】:

【参考方案1】:

对于那些无法解析参数并且仍然得到“错误:无法识别的参数:”的人,我找到了一种解决方法:

parser.add_argument('-d', '--dmp', nargs='+', ...)
opts = parser.parse_args()

然后当你想使用它时就这样做

' '.join(opts.dmp)

【讨论】:

如果我有一个像 : ma'am 中间有一个撇号(') 的字符串怎么办? @FuzzyAmi 并不优越。它只是补充它。我喜欢这两个答案。实际上我自己选择了接受的答案。 老实说,我什至不记得写过这篇评论。但我认为这个答案比接受的答案更好,因为它不假设任何关于 shell 的内容。接受的答案与 argparse 无关 - 它与外壳有关。它似乎不适用于那里的每种外壳(如 cmets 中所述)。另外,这个答案超过了接受的答案...... 在带有空格的文件路径周围传递双引号会在 Windows 中引发相同的错误。这种解决方法很有效。 如果在命令行上的位置参数之前指定了这样一个可选参数(这是 POSIX 准则),那么可选参数将使用紧随其后的所有位置参数。【参考方案2】:

简单的解决方案: 如果用引号封装,argparse 会将空格填充的字符串视为单个参数。

此输入有效并“解决”了问题:

-d "C:\SMTHNG\Name with spaces\MORE\file.csv"

注意:参数周围有“”。

【讨论】:

这与 argparse 无关;这就是 shell 在大多数系统上解析参数的方式(以及程序如何在没有真正 shell 的系统上伪造 shell 样式解析)。当您到达 argparse 模块时,您的原始版本已经是 4 个单独的参数,而 argparse 对此无能为力。 报价对我没有帮助,我仍然得到错误:无法识别的参数: @ofer.sheffer,在我的情况下,参数是生成的,所有事情都发生在服务器端的 linux 中,所以没有复制粘贴。 这对我也不起作用。 ARGS="--datasourceFile \"../datasources/CI-CD Test Cube.smodel\"" echo $ARGS 然后运行结果:--datasourceFile "../datasources/CI-CD Test Cube.smodel" 错误:无法识别参数:Test Cube.smodel" 你可能忘记传递带引号的 $ARGS:yourpythonscript "$ARGS"【参考方案3】:

今天也遇到了这个问题。

-d "foo bar"

没有帮助。我必须添加等号

-d="foo bar"

然后它确实起作用了。

【讨论】:

RHEL6 上的 python 3.5.1 这对我也不起作用。我的参数看起来像:ARGS="--datasourceFile=\"../datasources/CI-CD Test Cube.smodel\"" 回显看起来像:--datasourceFile="../datasources/CI-CD Test Cube. smodel”,我得到错误:无法识别的参数:Test Cube.smodel”【参考方案4】:

经过一些实验(python 2.7 Win10),我发现黄金法则是在包含空格的参数周围加上引号(“”),如果参数中没有空格,则 NOT 放置。即使您传递的是字符串/路径。加上单引号 ('') 也是一个坏主意,至少对于 Windows 而言。

小例子: python script.py --path ....\Some_Folder\ --string "这里有一个字符串"

【讨论】:

【参考方案5】:

您的 bash 脚本的一个常见错误是:

ARGS="C:\SMTHNG\Name with spaces\MORE\file.csv"
mypythonscript  -d $ARGS

应该是这样的

ARGS="C:\SMTHNG\Name with spaces\MORE\file.csv"
mypythonscript -d "$ARGS"

【讨论】:

【参考方案6】:

这里有两个重点(从我的角度来看):

    您不想替换参数输入中的所有空格。 你想使用argparse接口。

我最好的方法是使用 argparse.Action 和函数 strip 作为字符串:

import argparse

class StripArgument(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, values.strip())

parser = argparse.ArgumentParser(
    prog=f"your program", description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter,
    epilog="See '<command> --help' to read about a specific sub-command.")
parser.add_argument(
    "-n", "--variable-name", type=str, default='vx', action=StripArgument,
    help="Variable name inside something (default: %(default)s)")

【讨论】:

【参考方案7】:

您需要用引号将路径括起来,例如:

python programname.py -path "c:\My path with spaces"

在参数解析中,您会得到一个包含一个元素的列表。然后你必须像这样阅读它:

path = args.path[0]

【讨论】:

以上是关于处理 argparse 输入中的空格的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中调试 argpars

argparse 处理 bash 命令中的字符串和空格

python argpare 模块的简单用法

Python 杂记:argparse 模块

如何测试我的代码是不是引发了适当的 argparse 异常?

argparse:在 --help 中的标志后删除空格并使用 colorama 为帮助输出着色