Python新手,List Index超出范围

时间:2014-03-05 16:03:58

标签: python list indexing range

这是我的脚本,当我尝试运行它时出现错误

  

IndexError:列表索引超出范围

第9行(numberOfViewers = int(sys.argv[1]))。

有人可以帮助我并解释如何修复它吗?

import requests
import subprocess
import json
import sys
import threading
import time
from Queue import Queue

numberOfViewers = int(sys.argv[1])
builderThreads = int(sys.argv[2])
startTime = time.time()
numberOfSockets = 0
concurrent = 25
urls = []
urlsUsed = []

def getURL():
    output = subprocess.Popen(["livestreamer", "twitch.tv/spartanium", "-j"], stdout=subprocess.PIPE).communicate()[0]
    return json.loads(output)['streams']['worst']['url']

def build():
global numberOfSockets
global numberOfViewers
while True:
    if numberOfSockets < numberOfViewers:
        numberOfSockets += 1
        print "Building viewers " + str(numberOfSockets) + "/" + str(numberOfViewers)
        urls.append(getURL())

def view():
global numberOfSockets
while True:
    url=q.get()
    requests.head(url)
    if (url in urlsUsed):
        urls.remove(url)
        urlsUsed.remove(url)
        numberOfSockets -= 1
    else:
        urlsUsed.append(url)
    q.task_done()

if __name__ == '__main__':
for i in range(0, builderThreads):
    threading.Thread(target = build).start()

while True:
    while (numberOfViewers != numberOfSockets):
        time.sleep(1)

    q=Queue(concurrent*2)
    for i in range(concurrent):
        try:
            t=threading.Thread(target=view)
            t.daemon=True
            t.start()
        except:
            print 'thread error'
    try:
        for url in urls:
            print url
            q.put(url.strip())
            q.join()
    except KeyboardInterrupt:
        sys.exit(1)

`

3 个答案:

答案 0 :(得分:0)

您必须使用至少两个命令行参数调用您的程序,如下所示:

python2 yourscript.py 23 42

否则,sys.argv数组的元素少于3个,您将在其范围之外访问它。

在尝试访问命令行参数之前,最好显式检查命令行参数的数量:

if len(sys.argv) < 3:
  print "This program needs at least two arguments."
  sys.exit(1)

然后您的程序将打印一条有用的错误消息,而不是一个丑陋的异常。

答案 1 :(得分:0)

sys.argv list是指python中的命令行参数。在索引0上,始终存在脚本名称。其他更高的索引将包含您作为命令行参数传递给脚本的任何内容。所以你需要把它作为

运行
python script.py 2 4

其中2是sys.argv [1],即numberOfviewers

和4是sys.argv [2],即builderThreads

python docs链接:http://docs.python.org/2/library/sys.html

答案 2 :(得分:0)

sys.argv是命令行参数列表,其中第一个元素是脚本名称。

在Python中,所有列表都是零索引的,因此如果您尝试通过索引访问元素(就像在sys.argv之后使用方括号一样),但列表在该索引处没有元素, IndexError被提出。

例如

>>> my_list = [1,2] 
>>> my_list[0]
1
>>> my_list[2]
IndexError: list index is out of range

因此,在执行脚本时,您没有传递足够的命令行参数,因此sys.argv列表在索引2处没有项目,Python将引发IndexError

所以你可以尝试执行该行但捕获异常

try:
    builderThreads = int(sys.argv[2])
except IndexError:
    # do something appropriate after catch the exception

我还建议您查看argparse模块,它是Python标准库中“推荐的命令行解析模块”