2017-08-29 7 views
1

下のクラスが私を狂わせてしまっています。それはforループに固執しています。なぜself.job_idsの最後の要素にアクセスしないのか分かりません。これはうまくいくはずです。なぜこのforループがクラス内で動作しないのですか?クラス外では完全に動作します。forループがリストのすべての要素にアクセスしていないpython

輸入サブプロセス

class job_runner(): 

    def __init__(self, user_id='staffner'): 
     self.job_ids = ['12054807', '12054808', '12054809', '12054810', '12054811', '12054812', '12054813', '10', '100'] 

     self.user_id = user_id 

    def update_running_jobs(self): 
     ''' 
      () -> 
      Remove job ids from self.job_ids which completed 
     ''' 
     # find currently running jobs 
     curr_running = self.find_running_jobs() 

     #iterate over self.job_ids and see if they are in the currently running jobs 
     working_ids = self.job_ids 
     print 'start working ids:' 
     print working_ids 
     for j_id in working_ids: 

      # for some reason I can not access the last id in the list 
      print j_id 

      if j_id not in curr_running: 
       self.job_ids.remove(j_id) 
     print 'job_ids' 
     print self.job_ids 

    def find_running_jobs(self): 
     ''' 
      () -> list running ids 

      Find what job ids are still running on the high performance cluster 
     ''' 
     proc = subprocess.Popen(['squeue -u %s --Format=arrayjobid'%(self.user_id)], stdout=subprocess.PIPE, shell=True) 
     out, err = proc.communicate() 

     if err == None: 

      out_list = out.replace('ARRAY_JOB_ID', '').replace(' ', '').split('\n') 

      # filter out any empty strings 
      out_list = filter(None, out_list) 
      return out_list 

     else: 
      return False 

curr_jobs = job_runner() 

curr_jobs.update_running_jobs() 

はここ(あなたが100にアクセスされることはありません見ることができるように)出力です:

start working ids: 
['12054807', '12054808', '12054809', '12054810', '12054811', '12054812', '12054813', '10', '100'] 
12054807 
12054808 
12054809 
12054810 
12054811 
12054812 
12054813 
10 
job_ids 
['12054807', '12054808', '12054809', '12054810', '12054811', '12054812', '12054813', '100'] 
+0

私のマシンで正常に動作します – alfasin

+0

1台のマシンでは動作しませんが、別のマシンでは動作する理由はありますか? – Samantha

+1

'find_running_jobs()'呼び出しを削除し、関連するループがコードからすべての項目を表示しますが、完全なコードを実行すると、私のマシンは '100'を出力しますが' 10'を出力しません!!! – Juggernaut

答えて

4

あなたが変更する必要があります。

working_ids = self.job_ids 

へ:

working_ids = self.job_ids[:] # create a copy of job_ids and use it 

説明:反復処理中にリストを変更しているときに、予期しない結果が発生した場合は、リストのコピーを繰り返します。

+0

ありがとうございました。私はコピーを作っていると思った。 – Samantha

+0

@Samanthaは、Pythonで*割り当てを決して*コピーすることを覚えています。 –

+0

"...決して_data_をコピーしない" - オブジェクトへの参照をコピーする – holdenweb

関連する問題