47

使用 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

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

4

7 回答 7

52

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

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

然后当你想使用它时

' '.join(opts.dmp)
于 2014-11-18T09:06:45.450 回答
36

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

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

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

注意:参数有“”围绕它。

于 2013-08-10T00:09:43.303 回答
9

今天也碰到了这个问题。

-d "foo bar"

没有帮助。我不得不添加等号

-d="foo bar"

然后它确实起作用了。

于 2016-04-02T17:07:08.303 回答
2

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

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

于 2018-02-01T16:18:52.383 回答
0

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"
于 2022-02-01T10:23:07.643 回答
0

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

  1. 您不想替换参数输入中的所有空格。
  2. 你想使用argparse界面。

我最好的 aproax 是使用字符串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)")
于 2022-02-17T10:05:02.030 回答
-4

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

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

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

path = args.path[0]
于 2020-12-21T08:02:57.090 回答