如何将字符串语句作为命令行参数传递

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 的方法不是真正的生产可用或良好的实践应该在答案中明确指出,所以不会有人产生错误的印象。

以上是关于如何将字符串语句作为命令行参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中传递命令行参数[重复]

无法将“#”字符作为命令行参数传递

If 语句取决于传递的命令行参数是啥? [复制]

如何使用 argparse 将列表作为命令行参数传递?

将元组作为命令行参数传递

在 psql 命令行上传递数组参数