2017-08-29 3 views
1

Die Klasse unten macht mich verrückt. Es hängt an der for-Schleife. Ich bin mir nicht sicher, warum es nicht auf das letzte Element in self.job_ids zugreifen wird. Dies sollte funktionieren. Irgendwelche Ideen, warum diese for-Schleife nicht funktioniert innerhalb der Klasse, aber es funktioniert perfekt außerhalb der Klasse zu finden?For-Schleife nicht auf alle Elemente in einer Liste zugreifen Python

Import subprocess

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

Hier ist der Ausgang ist (wie Sie wird sehen können 100 nie erreicht):

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

Es funktioniert gut auf meinem Rechner – alfasin

+0

Gibt es einen Grund, warum es nicht auf einer Maschine funktioniert, aber auf einer anderen Maschine funktioniert? – Samantha

+1

Wenn ich 'find_running_jobs()' Aufruf entfernen und es ist auch verwandte Schleife aus dem Code zeigt es alle Elemente, aber mit Ihrem vollständigen Code, meine Maschine '100' drucken, aber nicht '10' drucken !!! – Juggernaut

Antwort

4

Sie ändern sollten:

working_ids = self.job_ids 

zu:

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

Erläuterung: Sie ändern die Liste während der Iteration, was zu unerwarteten Ergebnissen führt. Wenn Sie den Code ändern, wird eine Kopie der Liste iteriert.

+0

Vielen Dank. Ich dachte, ich würde eine Kopie machen. – Samantha

+0

@ Samantha nur daran erinnern, dass * Zuordnung nie, kopiert jemals * in Python. –

+0

"... kopiert niemals _data_" - es kopiert einen Verweis auf das Objekt – holdenweb

Verwandte Themen