这是我的脚本,当我尝试运行它时出现错误
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)
`
答案 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标准库中“推荐的命令行解析模块”