Python sys.argv列表和索引

时间:2010-04-12 23:05:25

标签: python

在下面的代码中我理解sys.argv使用列表,但是我不清楚这里是如何使用索引的。

def main():

  if len(sys.argv) >= 2:
    name = sys.argv[1]
  else:
    name = 'World'
  print 'Hello', name

if __name__ == '__main__':
  main()

如果我改变

name = sys.argv[1]

name = sys.argv[0] 

并为它返回的参数输入内容:

Hello C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py

哪种有意义。

有人可以解释这里使用2的方式:

if len(sys.argv) >= 2:

这里使用的是1:

name = sys.argv[1] 

5 个答案:

答案 0 :(得分:37)

让我们在命令行上说:

C:\> C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py John

为了便于阅读,我们只需将其缩短为:

C:\> hello.py John

argv表示通过命令行输入出现的所有项目,但计数从零(0)开始而不是一(1):在这种情况下,“hello.py”是元素0 ,“John”是元素1

换句话说,sys.argv[0] == 'hello.py'sys.argv[1] == 'John' ...但是,看看这有多少元素? 2,对!所以即使数字是0和1,这里有2个元素。

len(sys.argv) >= 2只检查您是否输入至少两个元素。在这种情况下,我们输入了2。

现在让我们将你的代码翻译成英文:

define main() function:
    if there are at least 2 elements on the cmd-line:
        set 'name' to the second element located at index 1, e.g., John
    otherwise there is only 1 element... the program name, e.g., hello.py:
        set 'name' to "World" (since we did not get any useful user input)
    display 'Hello' followed by whatever i assigned to 'name'

这是什么意思?这意味着如果你输入:

  • hello.py”,代码输出“Hello World”,因为您没有给出姓名
  • hello.py John”,代码输出“Hello John”因为你做了
  • hello.py John Paul”,代码仍会输出“Hello John”因为它不保存也不使用sys.argv[2],这是“Paul” - 你能看到吗?这种情况len(sys.argv) == 3,因为sys.argv列表中有3个元素?

答案 1 :(得分:10)

sys.argv是传递给Python程序的参数列表。第一个参数sys.argv[0]实际上是调用程序的名称。这不是Python的事情,而是大多数操作系统的工作方式。 sys.argv[0]存在的原因是,您可以根据调用方式更改程序的行为。因此,sys.argv[1]是您实际传递给该计划的第一个参数。

因为Python中的列表(如大多数序列)开始索引为0,并且因为索引超出列表末尾是一个错误,所以您需要检查列表的长度是否为2或更长,然后才能访问{{1} }。

答案 2 :(得分:6)

简而言之,sys.argv是用于运行程序的命令中出现的单词列表。第一个单词(列表的第一个元素)是程序的名称,列表的其余元素是提供的任何参数。在大多数计算机语言(包括Python)中,列表从零开始索引,这意味着列表中的第一个元素(在本例中为程序名称)为sys.argv[0],第二个元素(第一个参数,如果有)一)是sys.argv[1]等等。

测试len(sys.argv) >= 2只是检查列表的长度是否大于或等于2,如果程序中至少提供了一个参数,则会出现这种情况。

答案 3 :(得分:4)

所以,如果我想要返回一个名字和姓氏:Hello Fred Gerbig我会使用下面的代码,这段代码有效,但它实际上是最正确的方法吗?

import sys
def main():
  if len(sys.argv) >= 2:
    fname = sys.argv[1]
    lname = sys.argv[2]
  else:
    name = 'World'
  print 'Hello', fname, lname
if __name__ == '__main__':
  main()

编辑:发现上面的代码使用2个参数但是崩溃了1.试图将len设置为3但是什么也没做,仍然崩溃(重新阅读其他答案,现在理解为什么3什么也没做)。如果只输入一个参数,我该如何绕过参数?或者错误检查看起来如何返回“你必须输入2个参数”?

编辑2:弄清楚了:

import sys
def main():
  if len(sys.argv) >= 2:
    name = sys.argv[1] + " " + sys.argv[2]
  else:
    name = 'World'
  print 'Hello', name
if __name__ == '__main__':
  main()

答案 4 :(得分:2)

正如已经在不同的asnwers中所解释的那样,sys.argv包含调用Python脚本的命令行参数。

但是,Python附带的库可以帮助您轻松地解析命令行参数。即,新标准argparse。使用argparse可以省去编写大量样板代码的需要。