检查输入参数是否被引号包围
我有一个用Python 2.7写的脚本,它通过sys.argv[1:]来读取输入的参数。为了确保输入的参数不被拆分,必须在参数周围加上引号(否则sys.argv会在空格处把输入的参数拆开)。我该如何确保参数周围有引号呢?
举个例子:
python example.py -copyDir --dir:"C:\Users\heinst\Documents\heinsts music"
有没有办法检查一下这个--dir:
参数是否有引号包围?否则,sys.argv会把它拆分成两个部分:C:\Users\heinst\Documents\heinsts
和music
。
2 个回答
1
你可以简单地这样做:
if your_input[0] == your_input[-1] == '"':
#do something
这里的 your_input
是一个字符串,内容是:"C:\Users\heinst\Documents\heinsts music"
2
你可以使用标准库中的 argparse
,它会帮你正确解析字符串,包括空格。它还提供了很多其他功能,比如自动生成命令帮助文档,这里有个教程。
(最初摘自 这个问题)
编辑:
我终于明白原提问者的意思了!幸运的是,argv 是一个有序列表,所以可以解析带空格的 dir
。
使用 argparse 也可以做到这一点(见下面更新的例子,这个解决方案是从这个问题中借来的)
不过,传递未加引号的数据有个缺点,就是操作系统会在将数据传给 Python 解释器之前,先处理一些特殊字符(比如反斜杠)。所以你的脚本用户需要用双引号来传递目录(c:\\Users\\
)……
我不太确定哪种方式更好,但我会选择在选项中记录说明(用 argparse 非常简单),并在你的文档中说明。
example.py
import argparse
class JoinAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, " ".join(values))
parser = argparse.ArgumentParser()
parser.add_argument("-copyDir", action="store_true")
parser.add_argument("-d", "--dir", nargs="+", action=JoinAction)
args = parser.parse_args()
print args.__dict__
运行它
$ python example.py -copyDir --dir C:\\Users\\heinst\\Documents\\heinsts music
{'copyDir': True, 'dir': 'C:\\Users\\heinst\\Documents\\heinsts music'}