Python argparse在参数之前添加了额外的空间

时间:2016-12-02 07:46:51

标签: python command-line arguments

我发现argparse在参数之前添加了额外的空格。基于下面的示例代码

def parse_arguments():
    parser = argparse.ArgumentParser(
    prog='sample',
    description='bla bla',
    parser.add_argument('-s', '--search', dest='pattern', required=True,
    help='search path pattern (e.g. /dir1/dir2/*.ext)')

    args = parser.parse_args()

    if args.pattern[0] == ' ':
        print "One space is added to the argument"
    return args

并在交互式shell中测试:

import sys
sys.argv = ['', '-s /Users/user/Desktop/test']
execfile('test.py')

将参数设为sys.argv = ['', '-s=/Users/user/Desktop/test']不会导致这样的添加(从https://stackoverflow.com/a/36376287/2101864启发)。

是记录在案的行为还是我错过了什么?因为普通用户通常会在参数标记和值之间添加空格。

1 个答案:

答案 0 :(得分:2)

如果直接执行test.py,则不会出现额外空间。这种情况发生在交互式shell中,因为您在执行sys.argv之前将test.py设置为{。}}。

sys.argv = ['', '-s /Users/user/Desktop/test']

但是当从终端运行脚本并检查sys.argv时,你得到:

['test.py', '-s', '/Users/user/Desktop/test']

它还忽略了-s与从终端运行时的值之间的多个空格。

shell / terminal已经为脚本分别提供了每个参数(Python将它们放入一个列表中)。所以第二个参数只有-s而不是-s /Users/user/Desktop/test在交互式shell中执行sys.argv = ['', '-s', '/Users/user/Desktop/test']会得到正确的结果。

argparse 可能所做的是扫描sys.argv中的每个arg并查找所有参数名称模式,-s--search。一旦找到,之后的所有内容都是参数值。 =中的-s=/Users/user/Desktop/test是标准arg=value符号(过去更多),因此它将其解释为参数与其值之间的分隔符。