【问题标题】:New to Python, List Index out of rangePython新手,列表索引超出范围
【发布时间】:2014-03-05 16:03:58
【问题描述】:

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

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)

`

【问题讨论】:

  • 为什么你认为这个错误不应该存在?

标签: python list indexing range


【解决方案1】:

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

python2 yourscript.py 23 42

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

在尝试访问它们之前明确检查命令行参数的数量是一种很好的做法:

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

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

【讨论】:

    【解决方案2】:

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

    python script.py 2 4
    

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

    而 4 是 sys.argv[2] 即 builderThreads

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

    【讨论】:

      【解决方案3】:

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

      在 Python 中,所有列表都是零索引的,因此如果您尝试通过其索引访问一个元素(就像您在 sys.argv 之后使用方括号所做的那样),但该列表在该索引处没有元素,a 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标准库中推荐的命令行解析模块》

      【讨论】:

        猜你喜欢
        • 2015-08-19
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多