0

如果使用sys.argv,是否有任何理由使用*argsys.argv能够做任何事情*arg

例如:

>>>def test(*arg):
>>>    return arg
>>>
>>>print test('hello','salut','hola')
>>>('hello','salut','hola')

当我sys.argv在一个名为的文件中使用时trial.py,我从命令行调用:

import sys
def test(argument):
    return argument

print test(sys.argv[1])


python trial.py 'hello','salut','hola'
hello,salut,hola

或者argv真的只接受一个论点并且 argv 有可能超过 2 items(argv[0],argv[1])

4

2 回答 2

4

sys.argv是一个字符串列表,其中包含提供给脚本的任何可能的命令行参数。

第一个元素将是脚本本身的名称,其余条目将对应于通过命令行调用命令时指定的项目。所以回答你最后一个问题,argv可以包含2个以上的项目。

例如,如果您有一个名为testme.py并启动它的脚本

testme.py this is a test

然后

sys.argv[0] would contain "test.me"
sys.argv[1] would contain "this"
sys.argv[2] would contain "is"
sys.argv[3] would contain "a"
sys.argv[4] would contain "test"

shell 将确定分配给哪些条目sys.argv- 在您的情况下,因为它是一个没有空格分隔部分的连续字符串,所以它被认为是一个参数(因此似乎已被连接)。

于 2012-08-17T02:45:40.387 回答
3

sys.argv是一个列表,其中包含在命令行上调用您的 python 脚本的所有参数,脚本本身被认为是“参数 0”。

它是一个普通变量,与恰好包含列表的任何其他变量相同。sys.argv所以和之间没有“选择” *arg*arg是用于解包列表(或其他序列)以作为多个参数传递给调用的语法。传递时可以使用此语法sys.argv,就像使用包含列表的任何其他变量一样。或者您可以省略*并将整个列表作为一个参数传递。同样,列表是否碰巧与发生的sys.argv事情无关。

我认为您感到困惑的根源在于,您从中调用 python 脚本的 shell 不会像 Python 那样考虑将多个参数分开。在 Python 中,您使用逗号分隔多个参数,因此'hello','salut','hola'3 个参数也是如此(尽管在逗号后放置空格会更常见)。

在大多数 shell OTOH 中,参数由空格分隔。'hello','salut','hola'不包含任何空格,所以它只是一个参数。sys.argv因此它作为一项显示在 Python 列表中。没有什么神奇的事情可以为您将多个参数连接成一个。只是曾经只有一个论点。让 Python 级别sys.argv拥有 3 个项目的方法是调用您的脚本,如下所示:

python trial.py 'hello' 'salut' 'hola'

看起来您在 shell 命令行中使用引号的方式就像在 Python 中一样。在大多数 shell 中,您并不总是需要引用字符串,因为一切都是字符串。相反,引号用于告诉 shell 包含空格的字符串实际上是一个包含空格的参数,而不是多个参数,或者禁用 shell 默认情况下在任何地方执行的某些特殊处理。

在 Python'hello'中,必须使字符串“hello”,以便 Python 不会尝试将其读取为 variable hello。但在 shell 中,'hello'两者hello都是相同的,只是表示字符串“hello”。但是也可以he'll'o只用引用的字符串的一部分来编写。这只是改变了 shell 如何处理引号内的空格和其他特殊字符,但仍然产生相同的字符串“hello”。这就是为什么 shell 将您的表单解释'hello','salut','hola'为字符串“hello,salut,hola”。引号之外没有空格,因此这 3 个单词不会被视为单独的参数,并且在完成告诉 shell 如何处理特殊字符的工作后,引号就会消失。

于 2012-08-17T03:16:10.407 回答