处理argparse输入中的空格

ofe*_*fer 27 python user-input spaces command-line-arguments argparse

使用python和argparse,用户可以使用-d作为标志输入文件名.

parser.add_argument("-d", "--dmp", default=None)
Run Code Online (Sandbox Code Playgroud)

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

-d C:\SMTHNG\Name with spaces\MORE\file.csv
Run Code Online (Sandbox Code Playgroud)

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

error: unrecognized arguments: with spaces\MORE\file.csv
Run Code Online (Sandbox Code Playgroud)

花了我更长的时间来找到这个问题的解决方案......(没找到它的问答所以我自己发帖子)

Ill*_*huk 38

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

parser.add_argument('-d', '--dmp', nargs='+', ...)
opts = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

然后当你想要使用它时

' '.join(opts.dmp)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案优于公认的答案. (3认同)
  • 所以说实话,我甚至不记得写这篇评论.但我认为这个答案比被接受的答案要好,因为它没有假设shell.接受的答案不是关于argparse - 它关于shell.它似乎不适用于那里的每一种外壳(如评论中所述).另外,这个答案取消了被接受的答案...... (3认同)
  • @FuzzyAmi这不是优越的。它只是对它的补充。我都喜欢这两个答案。实际上,我本人选择了接受的答案。 (2认同)

ofe*_*fer 24

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

这个输入工作并"解决"了这个问题:

-d "C:\SMTHNG\Name with spaces\MORE\file.csv"
Run Code Online (Sandbox Code Playgroud)

注意:论证围绕着它.

  • 这不是关于argparse; 这就是shell在大多数系统上解析参数的方式(以及程序如何在没有真正shell的系统上伪造shell-style-parsing).当你到达`argparse`模块时,你的原始版本已经是4个独立的参数,而argparse对此无能为力. (10认同)
  • 报价在我的情况下没有帮助,我仍然得到错误:无法识别的参数: (7认同)
  • 这对我来说也不起作用。ARGS="--datasourceFile \"../datasources/CI-CD Test Cube.smodel\"" echo $ARGS 然后运行结果:--datasourceFile "../datasources/CI-CD Test Cube.smodel" 错误:无法识别参数:测试 Cube.smodel" (2认同)

小智 7

今天也遇到了这个问题。

-d "foo bar"
Run Code Online (Sandbox Code Playgroud)

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

-d="foo bar"
Run Code Online (Sandbox Code Playgroud)

然后它确实起作用了。

  • 这对我来说也不起作用。我的参数如下所示: ARGS="--datasourceFile=\"../datasources/CI-CD Test Cube.smodel\"" 回显如下: --datasourceFile="../datasources/CI-CD Test Cube. smodel”,我收到错误:无法识别的参数:Test Cube.smodel” (2认同)