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

在Python中从命令行解析带有空格的字符串,python,string,input,Python,String,Input,有没有一种方法可以在python中调用我的程序并向它传递一个我希望它解析的字符串,而不将该字符串声明为“我希望解析的字符串”,而是声明为我希望解析的字符串 import argparse #Parse command line for input parser = argparse.ArgumentParser(description='Parse input string') #position input argument parser.add_argument('string', hel

有没有一种方法可以在python中调用我的程序并向它传递一个我希望它解析的字符串,而不将该字符串声明为
“我希望解析的字符串”
,而是声明为
我希望解析的字符串

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字符串时
得到错误:
test.py:error:无法识别的参数:我要分析


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

问题是您给出了五个参数而不是一个参数。将字符串放在双引号之间,空格将起作用

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

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

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

如果确实要使用argparse,请将
nargs='+'
nargs='*'
添加到
add_参数

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)
如果可以的话,我真的很喜欢,所以我推荐:

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

import docopt
arguments = docopt.docopt(__doc__)
input_argument = ' '.join(arguments['<input>'])
print(input_argument)
用法: test.py。。。 """ 导入docopt 参数=docopt.docopt 输入参数=“”。连接(参数[“”]) 打印(输入参数) Docopt根据帮助消息生成解析器,这太棒了。

正确的方法如下。但OP特别问:

我希望它在不将字符串声明为
'string I want parse'
的情况下进行解析,但将其声明为
string I want 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)
这是有可能做到这一点,一个简单的方法。与简单地连接
sys.argv[1://code>相比,这种方法的优势在于解决以下问题:

在到达输入的末尾或到达另一个解析参数(如-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
演示:


可以使用sys.argv检索列表中命令行的所有参数,然后通过解析此列表在程序中生成字符串。感谢@Just的输入,但我希望输入时不带引号谢谢。你能给我解释一下:
arg\u str=''.join(args.string)
在做什么吗?当你使用nargs时,args.string是一个字符串列表,而不是单个字符串(因此变量的名称很不幸)。'。join(['a'、'b'、'c']会导致'abc'。如问题中所述,一旦“到达输入的末尾或到达另一个解析参数,如-s”,这种方法可能会出现问题。如果有其他解析选项,将需要一些有趣的编码为什么?在my中(不太广泛)体验它的工作和
nargs
的文档没有提到任何限制,它甚至给出了这样的示例
>>解析器。add_参数('--bar',nargs='*')>>解析器。add_参数('baz',nargs='*')
对不起,我说的是使用
''的选项。join(sys.argv[1:]
。理想情况下,我认为这种连接应该通过
ArgumentParser
实例来完成,而不是通过在args上手动进行后处理