【发布时间】:2019-03-05 09:19:45
【问题描述】:
python标准库提供distutils.util.split_quoted和shlex.split。
是否存在distutils.util.split_quoted(s) 与shlex.split(s) 给出不同结果的情况?
【问题讨论】:
python标准库提供distutils.util.split_quoted和shlex.split。
是否存在distutils.util.split_quoted(s) 与shlex.split(s) 给出不同结果的情况?
【问题讨论】:
是的。这些算法不同意空格的定义:shlex 硬编码四个字符' \t\r\n',但是distutils 在a regex 中使用string.whitespace。因此,它还额外考虑了一些其他字符作为分隔符。
换页:
>>> distutils.util.split_quoted('A\fB')
['A', 'B']
>>> shlex.split('A\fB')
['A\x0cB']
垂直标签:
>>> distutils.util.split_quoted('A\vB')
['A', 'B']
>>> shlex.split('A\vB')
['A\x0bB']
【讨论】:
python3 myscript.py a,b 将在sys.argv 中得到["myscript.py", "a", "b"]。如果未设置 IFS,则系统仅使用空格和制表符 -它应该 not 在换页、垂直制表符甚至回车上拆分字段(我已经在我的 posix 兼容系统上验证了这一点,确实 \r 不会拆分单词)。所以,我会说两者都不完全正确,但shlex.split 可能是两者中“更正确”的一个。