2016-03-23 13 views
0

私は数多くのリストを持つプログラムを持っています。プログラムのクイックダウン、lsblkを開いてディスクをチェックし、ファイルに保存します。次に、.shファイルを含むディスクを取り出し、新しいリストが何であるかを調べるためにスキャンします。私は2つの違いのリストを比較し、違いを読んで整数をスキャンし、最初のintを引き出して最終的にdiskchangeというリストに戻します。以下を参照:リストに混乱しました:TypeError:リストインデックスはstrでなく整数でなければなりません

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])) 

をあなたには、いくつかのprint文で問題を診断しようとすると、ここに出力され、私を見ることができます:

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は結果から引き出され、最終的な値であり、私は種類を印刷しますディスクのタイプがintであることを示すために、私はタイプリストとしてdiskchangeも表示していますが、何らかの理由でintをリストに格納できません。

disk = []の初期値をNone、0、1、 ''に変更しようとしましたが、変更はありません。私はstr(ディスク)int(ディスク)と同様のものを試しました。

だけでも、diskchange [i] = 0と入力すると同じメッセージが表示されます。どちらが私を最も混乱させているのですか?

助けていただければ幸いです。

+2

変数iを2つの異なるループに再利用しています。通常これはOKですが、ループが互いに内側にあるため、 'i'はオーバーライドされています。 – Oisin

+0

うわー、そんなに小さな間違い。頭痛を救ってくれてありがとう –

答えて

0

あなたはシャドウイングしているあなたのためのループ別ii

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 

ので注意してください。

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

ボーナス:

次のコードでは、あなたが実行するスクリプトの完全な内容を読んでいるだけでjにインデックス名を変更し、あなたの問題を解決するには

with open('removeslot%d.sh' %i, 'rb') as f: 
    script = f.read() 
subprocess.call(script, shell=True) 

これは実際にはengですineered、あなたは単に行うことができます。

subprocess.call('removeslot%d.sh' % i, shell=True) 

(あなた.shが実行可能でない場合、あるいは'bash removeslot%d.sh' % i)スクリプトを実行します。また、シンボルをシャドーイングすることにも注意してください。fileは、グローバルに利用可能なファイルを処理するクラスです。代わりにfを使用してください!

HTH

関連する問題