如何将字符串语句作为命令行参数传递
Posted
技术标签:
【中文标题】如何将字符串语句作为命令行参数传递【英文标题】:How to pass a String sentence as Command Line Argument 【发布时间】:2017-07-26 07:00:33 【问题描述】:以下代码采用可在 Python 端检索的单个字符串值。如何用带空格的句子字符串做到这一点?
from sys import argv
script, firstargument = argv
print "The script is called:", script
print "Your first variable is:", firstargument
要运行,我会这样传递参数:
$ python test.py firstargument
哪个会输出
The script is called:test.py
Your first variable is:firstargument
示例输入可以是“程序运行的 Hello world”,我想将其作为命令行参数传递,以存储在“first”变量中。
【问题讨论】:
就是这样。test.py "Hello world the program runs"
所以它需要引号 "" 不像我的例子。
另外你的变量应该是first
而不是firstargument
@RichardSmith,Python 根本看不到引号;它们由 shell 解释,并告诉它如何将内容拆分到 argv 数组中(这也是 shell 在启动 Python 之前所做的事情)。
请参阅man execv
了解用于在 UNIX 上启动另一个程序的底层 C 库调用系列——您会看到任何在 UNIX 上启动另一个程序的程序都需要提供一个 array 的 C 字符串作为参数(并且该数组被命名为 argv
,除非使用基于 varargs 的调用约定,允许该数组的每个元素作为不同的参数传递给调用)。
【参考方案1】:
多字命令行参数,即包含多个由空格字符 %20
分隔的 ASCII 序列的单值参数,必须在命令行中用引号括起来。
$ python test.py "f i r s t a r g u m e n t"
The script is called:test.py
Your first variable is:f i r s t a r g u m e n t
这其实和Python完全没有关系,而是和your shell parses the command line arguments.的方式有关
【讨论】:
【参考方案2】:argv 将是 shell 解析的所有参数的列表。
所以如果我做
#script.py
from sys import argv
print argv
$python script.py hello, how are you
['script.py','hello','how','are','you]
脚本的名称始终是列表中的第一个元素。如果我们不使用引号,每个单词也会成为列表的一个元素。
print argv[1]
print argv[2]
$python script.py hello how are you
hello
how
但如果我们使用引号,
$python script.py "hello, how are you"
['script.py','hello, how are you']
所有单词现在都是列表中的一项。所以做这样的事情
print "The script is called:", argv[0] #slicing our list for the first item
print "Your first variable is:", argv[1]
或者如果您出于某种原因不想使用引号:
print "The script is called:", argv[0] #slicing our list for the first item
print "Your first variable is:", " ".join(argv[1:]) #slicing the remaining part of our list and joining it as a string.
$python script.py hello, how are you
$The script is called: script.py
$Your first variable is: hello, how are you
【讨论】:
“如果你不想使用引号”版本有问题。如果 OP 将三个空格放在一起,它将被替换为一个;如果 OP 放置了*
,它将被替换为文件名列表;等等。当我们为先验不知道该过程如何工作的人构建答案时,包含警告的答案应明确指出。
没错,有数百种方法可以搞乱连接。但这更像是一个参考。
是的——我要争辩的一点是,这种 FYI 的方法不是真正的生产可用或良好的实践应该在答案中明确指出,所以不会有人产生错误的印象。以上是关于如何将字符串语句作为命令行参数传递的主要内容,如果未能解决你的问题,请参考以下文章