【问题标题】:To ignore space in python argparse忽略 python argparse 中的空格
【发布时间】:2016-04-03 17:16:57
【问题描述】:

下面的代码,

import os
import shutil
import argparse

if __name__ == '__main__':
    ap = argparse.ArgumentParser(description="Test")
    ap.add_argument('-s', '--values', action="store", dest="values", nargs='+', type=str)
    args = vars(ap.parse_args())
    print args

这段代码的输入是

$python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC 90032#95002#s#2#+200ABC 90033#95003#s#3#+300 ABC

实际输出是

{'values': ['90030#95000#m#6099#base_case', '90031#95001#s#1#+100ABC', '90032#95002#s#2#+200ABC', '90033#95003#s#3#+300', 'ABC']}

但是,我需要通过忽略第三个参数中的空格来输出如下。

{'values': ['90030#95000#m#6099#base_case', '90031#95001#s#1#+100ABC', '90032#95002#s#2#+200ABC', '90033#95003#s#3#+300 ABC']}

我可以知道如何传递正确的参数

【问题讨论】:

  • 用引号括住最后一个参数"90033#95003#s#3#+300 ABC"

标签: python


【解决方案1】:

这不是 argparse 问题。这是一个 shell 问题。你的 shell 解析出参数并将它们作为数组传递给 Python。

通过在构成一个参数的部分加上引号来告诉 shell 不解析字符串:

$ python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC \
    90032#95002#s#2#+200ABC "90033#95003#s#3#+300 ABC"

注意 "90033#95003#s#3#+300 ABC" 作为最后一个参数。

您也可以使用反斜杠来转义空格:

$ python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC \
    90032#95002#s#2#+200ABC 90033#95003#s#3#+300\ ABC

使用csh 和您的示例代码进行演示:

% python test.py -s a b c
{'values': ['a', 'b', 'c']}
% python test.py -s a "b c"
{'values': ['a', 'b c']}
% python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC 90032#95002#s#2#+200ABC 90033#95003#s#3#+300\ ABC
{'values': ['90030#95000#m#6099#bc', '90031#95001#s#1#+100ABC', '90032#95002#s#2#+200ABC', '90033#95003#s#3#+300 ABC']}

【讨论】:

  • 那没有解决。我仍然得到相同的分离输出。我正在使用 /bin/csh shell
  • @Raghavan:csh 在这里的行为与我能找到的没有什么不同。 argparse 如果由 shell 正确传递,肯定会尊重参数中的空格。
  • @Raghavan:使用您问题中的代码,运行 csh 我根本无法重现该问题。我的答案中的所有样本都有效并产生90033#95003#s#3#+300 ABC' 作为values 列表中的最后一个值。
  • 谢谢你,这有帮助。我正在运行这个 python 脚本和另一个 shell 脚本来在后台运行这个 python 脚本。该 shell 脚本导致了该行为。谢谢。
  • @Raghavan:听起来你当时遇到了this problem..
【解决方案2】:

只需用引号将参数括起来

python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC 90032#95002#s#2#+200ABC "90033#95003#s#3#+300 ABC "

【讨论】:

  • 那没有解决。我仍然得到相同的分离输出。我正在使用 /bin/csh
  • @Raghavan: csh 在此处的行为没有什么不同,请参阅 UNIX shell quote tutorial
【解决方案3】:

用单引号或双引号将参数括起来:

$ python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC 90032#95002#s#2#+200ABC '90033#95003#s#3#+300 ABC'

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多