String 列表混乱:TypeError:列表索引必须是整数,而不是str

String 列表混乱:TypeError:列表索引必须是整数,而不是str,string,list,int,String,List,Int,我有一个有许多列表的程序,并且一直在轻松地为它们分配变量,除了一个列表。快速运行的程序,我打开lsblk检查磁盘,保存到一个文件。然后,我删除一个带有.sh文件的磁盘,然后扫描以查看新列表是什么。我比较两个列表的差异,然后读取差异并扫描整数,然后拉出第一个整数,最终将其保存回名为diskchange的列表。见下文: diskchange = [None]*5 for i in range(1,3): # Initial disk scan lsblk = subprocess.

我有一个有许多列表的程序,并且一直在轻松地为它们分配变量,除了一个列表。快速运行的程序,我打开lsblk检查磁盘,保存到一个文件。然后,我删除一个带有.sh文件的磁盘,然后扫描以查看新列表是什么。我比较两个列表的差异,然后读取差异并扫描整数,然后拉出第一个整数,最终将其保存回名为diskchange的列表。见下文:

diskchange = [None]*5

for i in range(1,3):
    # Initial disk scan
    lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    scan1 = [line.strip() for line in lsblk.stdout if 'nvme' in line]

    # Disable the slot to get ready to record which drive number disappeared
    with open('removeslot%d.sh' %i, 'rb') as file:
        script = file.read()
    subprocess.call(script, shell=True)

    lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    scan2 = [line.strip() for line in lsblk.stdout if 'nvme' in line]

    for i in scan1:
        if i not in scan2:
                result = result + i

    disk = filter(str.isdigit, result)
    strdiskchange = str(disk)
        disk = int(strdiskchange[0])
    print disk
    print type(disk)
    print type(diskchange)
    diskchange[i] = disk
        print("The new disk added to slot %i is /dev/nvme%sn1" %(i, diskchange[i]))
您可以看到我试图用一些打印语句诊断问题,以下是输出:

0
<type 'int'>
<type 'list'>
Traceback (most recent call last):
File "GUIArduino.py", line 61, in <module>
diskchange[i] = disk
TypeError: list indices must be integers, not str
0
回溯(最近一次呼叫最后一次):
文件“guiardino.py”,第61行,在
diskchange[i]=磁盘
TypeError:列表索引必须是整数,而不是str
0是从结果中提取的最终值,我将磁盘类型打印到屏幕上以显示它是int类型,我还将diskchange打印为type list,但由于某种原因,我无法将int存储到列表中

我尝试将disk=[]的初始值更改为None、0、1',但没有更改。我也试过str(disk)int(disk)之类的

即使只是键入diskchange[i]=0也会给出相同的消息。哪一个让我最困惑


任何帮助都将不胜感激

您正在用另一个
i
跟踪for循环
i

for i in range(1,3):
    # type(i) is int
    …
    for i in scan1:
        …
    # type(i) is str
    …
    diskchange[i] = disk # i is str() here, so it yells at you!
将内部循环的索引从
i
更改为
j
,您应该会没事的

在python中,变量的可见性覆盖整个函数,而不是块。 因此,在块内定义变量时,它在块后仍然可见:

 i = 'foobar'
 print(i, type(i))
 for i in range(100):
     pass
 print(i, type(i))
将提供:

foobar str
100 int
所以在重用变量名时要小心

要解决您的问题,只需将索引名更改为
j

for j in scan1:
    if j not in scan2:
            result = result + j

奖金:

在以下代码段中,您正在读取脚本的完整内容,通过将其全部内容发送到shell来执行脚本:

with open('removeslot%d.sh' %i, 'rb') as f:
    script = f.read()
subprocess.call(script, shell=True)
这实际上是过度设计的,您只需执行以下操作:

subprocess.call('removeslot%d.sh' % i, shell=True)
要执行脚本(或
'bash removeslot%d.sh“%i
,以防
.sh
不可执行)。还要注意,您再次隐藏了一个符号:
file
是处理全局可用文件的类。改用
f


HTH

您正在为两个不同的循环重用变量
i
。正常情况下,这是可以的,但是因为循环在彼此内部,
i
被覆盖了。哇,这么小的错误。谢谢你帮我省去了一些头痛