在Python中从命令行解析带有空格的字符串
有没有一种方法可以在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
“我希望解析的字符串”
,而是声明为我希望解析的字符串
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上手动进行后处理