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

时间:2015-12-13 20:57:51

标签: 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)

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

是否有告诉脚本考虑空格并将输入作为一个字符串,直到到达输入的末尾或达到另一个解析参数如-s

4 个答案:

答案 0 :(得分:4)

"正确"方法是already mentioned。但OP明确要求:

  

我希望它解析而不将字符串声明为'String I want to parse',而是String I want to parse

可以使用custom action执行此操作。简单地加入sys.argv[1:]这种方法的优点是解决以下问题:

  

是否有告诉脚本考虑空格并将输入作为一个字符串,直到到达输入的末尾或者达到另一个解析参数如-s?

我们可以添加其他选项,而不必将其删除到'字符串'参数:

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

演示:

$ 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')

答案 1 :(得分:3)

如果你真的想使用argparse将nargs='+'nargs='*'添加到add_argument

import argparse
parser = argparse.ArgumentParser(description='Parse input string')
parser.add_argument('string', help='Input String', nargs='+')
args = parser.parse_args()
arg_str = ' '.join(args.string)
print(arg_str)

python test.py abc xyz将生成abc xyz*表示空列表正常,+至少需要一个单词。

如果您不需要任何花哨的东西,也可以只使用sys.arg:

import sys
arg_str = ' '.join(sys.argv[1:])  # skip name of file
print(arg_str)

如果可以,我真的很喜欢docopt所以我会推荐它:

"""Usage:
  test.py <input>...
"""

import docopt
arguments = docopt.docopt(__doc__)
input_argument = ' '.join(arguments['<input>'])
print(input_argument)

Docopt根据帮助信息生成解析器,它非常棒。

答案 2 :(得分:2)

问题是你给出五个参数而不是一个。在双引号之间放置带有空格的字符串,它将起作用。

~ ❯❯❯ python test.py asd asd
usage: test.py [-h] string
test.py: error: unrecognized arguments: asd
~ ❯❯❯ python test.py "asd asd"
asd asd
~ ❯❯❯

答案 3 :(得分:0)

您可以将所有参数连接在一起,直到参数以-

开头
import sys

new_args = []
for arg in sys.argv:
   if arg.startswith("-") or len(new_args) == 0:
      new_args.append(arg)
   else:
      new_args[-1] += arg