我发现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启发)。
是记录在案的行为还是我错过了什么?因为普通用户通常会在参数标记和值之间添加空格。
答案 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
符号(过去更多),因此它将其解释为参数与其值之间的分隔符。