【问题标题】:Checking if quotes surround input argument检查引号是否围绕输入参数
【发布时间】:2014-05-22 14:38:11
【问题描述】:

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

【问题讨论】:

  • 请记住,没有空格你不需要引号,并且在 Linux 上而不是引用路径是正常的,以逃避空格,例如--dir=~/My\ Music
  • 您是否要确保参数格式正确?正如@SteveBarnes 所提到的,仅检查参数是否包含引号并不能涵盖所有情况。
  • 您的整个 --dir 参数将被 CMD 和 Python 视为带有嵌入空格的单个参数。用一个小脚本测试它:echo {%1} {%2} {%3}
  • @icedtrees 我只是想确保如果输入参数中有空格并且如果有空格,则路径不会因此而混乱。现在发生的情况是脚本找不到路径,如果它周围没有引号,因为 C:\Users\heinst\Documents\heinsts 不存在,但 C:\Users\heinst\Documents\heinsts music 存在跨度>
  • @heinst 无法检查引号外是否有空格,甚至无法检查引号外有多少空格。请参阅stackoverflow.com/questions/667540/… - 当 args 到达您的 python 程序时已经太晚了。你最好的选择是遵循 tutuDajuju 的方法,当 args 不正确时会产生一个很好的错误退出消息,或者你可以做一些 hacky 手动处理,假设只有一个空格,然后 " ".join 有问题的 args。跨度>

标签: python python-2.7


【解决方案1】:

您可以使用标准包argparse,它将负责正确解析字符串以包含空格。它还可以让您拥有许多其他功能(例如自动准备命令帮助,here's a tutorial):

(原文取自this question

编辑:

我终于明白OP的意思了!幸运的是 argv 是一个有序列表,因此可以用空格解析 dir

这也可以使用 argparse(参见下面的更新示例,solution shamelessly stolen from this question

传递不带引号的数据的缺点是操作系统在将特殊字符(如反斜杠)传递给 python 解释器之前对其进行转义。所以你的脚本用户必须用双引号传递目录 (c:\\Users\\) ...

不确定哪个更好,但我会在 opts(使用 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'}

【讨论】:

  • 更新到示例以包含空格并阐明答案。您现在可以看到它负责将双引号内的内容解析为“dir”参数
  • 这是最好的解决方案,但仍然不能解决发帖者的问题。如果你仔细阅读帖子,你会注意到发帖人使用的是 argv,它已经正确处理了空格。当参数格式不正确时,发布者希望处理引号外的空格。
【解决方案2】:

您可以简单地执行以下操作:

if your_input[0] == your_input[-1] == '"':
    #do something

其中your_input 是字符串:"C:\Users\heinst\Documents\heinsts music"

【讨论】:

  • 你确定这会起作用吗?我很确定 sys.argv 会从参数中去掉引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2022-01-19
  • 2021-04-05
  • 2017-12-25
  • 2016-05-19
相关资源
最近更新 更多