【问题标题】:Handle spaces in argparse input处理 argparse 输入中的空格
【发布时间】: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

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

【问题讨论】:

    标签: python command-line-arguments user-input argparse spaces


    【解决方案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】:

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

        1. 您不想替换参数输入中的所有空格。
        2. 你想使用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]
          

          【讨论】:

            猜你喜欢
            • 2021-05-23
            • 2014-09-01
            • 1970-01-01
            • 2016-06-10
            • 2023-04-05
            • 1970-01-01
            • 2021-09-04
            • 1970-01-01
            相关资源
            最近更新 更多