检查输入参数是否被引号包围

4 投票
2 回答
2282 浏览
提问于 2025-04-18 02:01

我有一个用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\heinstsmusic

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'}

撰写回答