在 Python 中从命令行解析带有空格的字符串

wpr*_*ins 3 python string input

有没有办法在 python 中调用我的程序并向它传递一个字符串我希望它解析而不将字符串声明'String I want to parse'String I want to parse

import argparse

#Parse command line for input
parser = argparse.ArgumentParser(description='Parse input string')
#position input argument
parser.add_argument('string', help='Input String')

args = parser.parse_args()
arg_str = args.string

print(arg_str)
Run Code Online (Sandbox Code Playgroud)

当我运行时$ python test.py String I want to parse出现错误:test.py: error: unrecognized arguments: I want to parse

无论如何要告诉脚本考虑空格并将输入作为一个字符串,直到到达输入的末尾或到达另一个解析参数(例如-s到达)?

wim*_*wim 5

“正确”方法如前所述。但 OP 特别询问:

我希望它在不将字符串声明为'String I want to parse'但作为String I want to parse

可以使用自定义操作来做到这一点。这种方法比简单加入的优势sys.argv[1:]在于解决以下问题:

无论如何要告诉脚本考虑空格并将输入作为一个字符串,直到到达输入的末尾或到达另一个解析参数(例如 -s)?

我们可以添加其他选项,而不会将它们清除到 'string' 参数中:

import argparse

class MyAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, ' '.join(values))

parser = argparse.ArgumentParser(description='Parse input string')
parser.add_argument('string', help='Input String', nargs='+', action=MyAction)
parser.add_argument('--extra', '-s', help='Another Option!')

args = parser.parse_args()
print args
Run Code Online (Sandbox Code Playgroud)

演示:

$ python example.py abc def ghi
Namespace(extra=None, string='abc def ghi')
$ python example.py abc def ghi -s hello
Namespace(extra='hello', string='abc def ghi')
$ python example.py -s hello abc def ghi 
Namespace(extra='hello', string='abc def ghi')
Run Code Online (Sandbox Code Playgroud)