Python ValueError:列表。删除(x):x不在列表中,项目肯定存在
它会正确地删除第一个循环中的所有内容,但在删除第二个循环中的快照时会抛出此内容,知道为什么吗?我可能一直在运行Python3,现在又回到了2.7,这可能是我的问题吗?它似乎从列表中删除了一项,但再也无法删除更多项Python ValueError:列表。删除(x):x不在列表中,项目肯定存在,python,Python,它会正确地删除第一个循环中的所有内容,但在删除第二个循环中的快照时会抛出此内容,知道为什么吗?我可能一直在运行Python3,现在又回到了2.7,这可能是我的问题吗?它似乎从列表中删除了一项,但再也无法删除更多项 for i in range(0, numOfSnap): tempName = baseVv.name + ".ro" + str(i) snapVv = baseVv.createSv(name=baseVv.name + ".ro"
for i in range(0, numOfSnap):
tempName = baseVv.name + ".ro" + str(i)
snapVv = baseVv.createSv(name=baseVv.name + ".ro" + str(i), svOptions="-ro -i %s" % x)
x += 1
dlog.info("Creating %s" % tempName)
baseVv.name + ".rw" + str(i)
tempName = baseVv.name + ".rw" + str(i)
rwSnap = snapVv.createSv(name=baseVv.name + ".rw" + str(i), svOptions="-i %s" % x)
x += 1
snapRwVlun = self.cluster.createVlun(vv=rwSnap, host=host)
dlog.info("Creating %s" % tempName)
rwSnapList.append(rwSnap)
vlunList.append(snapRwVlun)
## delay random seconds between RO snapshot creation
time.sleep(random.randint(5,30))
snapRoList = baseVv.snapSvList
dlog.info("Stopping IO on VV")
self.cluster.stopSnapIOOnHosts()
dlog.info("Starting IO on snaps and VV")
self.cluster.startSnapIOOnHosts()
dlog.info("Sleep 60 seconds for IO to go through")
time.sleep(60)
dlog.info("Stopping IO")
self.cluster.stopSnapIOOnHosts()
time.sleep(60)
for vluns in vlunList:
vluns.remove()
dlog.info("Waiting 60 seconds")
time.sleep(60)
## randomly pick 1 rw snapshot to delete till removal of all snapshot
for i in range(0, numOfSnap)[:]:
snapIndex = random.randint(0, len(rwSnapList)-1)
dlog.info("remove %s" % rwSnapList[snapIndex].name)
roSnapshot = rwSnapList[snapIndex]
roSnapshot.remove()
#self.cluster.waitForClusterIntegrated()
## remove it from object list
rwSnapList.remove(roSnapshot)
time.sleep(random.randint(5,10))
## randomly pick 1 ro snapshot to delete till removal of all snapshot
for i in range(0, numOfSnap)[:]:
snapIndex = random.randint(0, len(snapRoList)-1)
dlog.info("remove %s" % snapRoList[snapIndex].name)
roSnapshot = snapRoList[snapIndex]
roSnapshot.remove()
#self.cluster.waitForClusterIntegrated()
## remove it from object list
snapRoList.remove(roSnapshot)
time.sleep(random.randint(5,10))
不要从快照列表中随机选取索引,而是将该列表无序排列一次,然后从该无序排列的列表中弹出项目:
shuffledSnapList = snapRoList[:]
random.shuffle(shuffledSnapList)
while shuffledSnapList:
roSnapshot = shuffledSnapList.pop()
通过在对要从中删除的列表进行循环测试时使用,可以保证当列表为空时循环将终止
因为列表是随机排列的,所以项目是按随机顺序处理的。为什么要麻烦地将它们从列表中删除,您只想在所有机器上调用.remove()
def removeAll(snapshots, minsleep=5, maxsleep=10):
random.shuffle(snapshots)
for snapshot in snapshots:
dlg.info("remove %s" % snapshot.name)
snapshot.remove()
time.sleep(random.randint(minsleep, maxsleep))
removeAll(rwSnapList)
removeAll(roSnapList)
你能把你的问题简化成一个简单的(2行或3行)例子吗?看起来很多这样的代码不需要出现错误。你能给我们举一个简单的例子吗?或者至少告诉我们哪一行出错了,包括堆栈跟踪?我不会阅读所有代码并试图猜测你做错了什么。对不起,我只是向你展示了列表是如何设置的,当这一行被称为snapRoList.remove(roSnapshot)时会出现错误,但在它已经执行这一行一次之后。roSnapshot有什么值?为什么你认为这个特殊的值会破坏它?同时考虑一下SaaPROPELT包含的内容,我会尝试一下。