Sys.argv python错误列表索引超出范围

时间:2017-12-06 00:01:59

标签: python list range argv sys

我是stackoverflow的新用户,除了我不是英国人,所以我很抱歉我的英语。

我在python中编程直到我犯了一个错误,因为我无法弄清楚出了什么问题......

#!/usr/bin/env python2.7

from random import choice
import sys

def help():
    print ("Please, you need to introduce a Int in this way: PWrand 10")

def PWrand(insert_by_user):
    chars = 'ABCDEFGHIJKLMNOPQRSTUWXYZabcdefghijklmnopqrstuwxyz0123456789!-_:.,;&)('

    for password in range(insert_by_user):
        sys.stdout.write(choice(chars))

 #Command Line

if __name__ == '__main__':

    if len(sys.argv) < 2 or len(sys.argv) > 2:
        help()

    elif (type(sys.argv[2]) != int):
        print("It need to be an Int!")

    else:
        insert_by_user = (sys.argv[2])
        print(PWrand(insert_by_user))

所以,这就是我所做的。

Traceback (most recent call last):
  File "./passwordrandom.py", line 24, in <module>
    elif (type(sys.argv[2]) != int):
IndexError: list index out of range

谢谢大家!

2 个答案:

答案 0 :(得分:1)

这里有两个问题。首先是你对列表索引有点困惑。 python中的列表是&#34;零索引&#34;意味着要获取名为L的列表的第一个元素,您需要执行L[0]。同样,为了得到第二个,你需要做L[1]

另一个问题是来自sys.argv的所有元素都将成为字符串,因此检查类型将无法正常工作。您应该尝试将用户输入的内容作为int放在try块中并捕获ValueError。它看起来像这样:

if __name__ == '__main__':

    if len(sys.argv) < 2 or len(sys.argv) > 2:
        help()

    else:
        try:
            insert_by_user = int(sys.argv[1])
            print(PWrand(insert_by_user))
        except ValueError:
            print("It need to be an Int!")

只有在用户的输入无法正确转换为整数时,才会执行except ValueError:块内的代码。

答案 1 :(得分:1)

这是因为第一个if捕获每个列表少于2个元素的列表或者包含2个以上元素的所有列表,所以elif正在捕获具有正好2个元素的所有内容,这些元素将存储在0位置和1。

if len(sys.argv) is not 2:
    help()

else:
   user_input = sys.argv[1].decode()
   if not user_input.isnumeric():
      print("It need to be an Int!")
   else:
       user_input = int(user_input)

应该修复它。