处理 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 输入中的空格的主要内容,如果未能解决你的问题,请参考以下文章