2013-05-14 3 views
0

Я занимаюсь некоторыми исследованиями по этому вопросу, но все вопросы (в моем понимании новичков), похоже, направлены на то, как выяснить, работает ли программа ANOTHER, а не сам Python.Как узнать, работает ли процесс в Python?

Итак, в настоящее время я работаю над кодом, который генерирует буферы вокруг набора строк в шейп-файле. Это пакетный процесс, который включает в себя 20 шейп-файлов и до 4000 строк внутри них. Процесс занимает очень много времени, и я начинаю задаваться вопросом, действительно ли он работает. Обычно я использую операторы печати, чтобы отслеживать ход моего кода, но в этом случае я вызываю ArcGIS для выполнения этой функции, поэтому единственным оператором печати, который я могу написать, является один ПОСЛЕ того, как все строки были обработаны, а не пока все еще Бег.

Есть ли способ узнать, продолжается ли процесс (кроме проверки диспетчера задач, чтобы убедиться, что он заблокирован)?

безумный способ сделать это Я думал (не знаю, возможно ли что-то подобное): я думал о чем-то вроде написания чего-либо в txt-файле каждые X минут, пока скрипт не закончил работать ,

Спасибо !!!!

Мой код:

def Buffer30m(self,InputFile,OutputBuffer, size):  
    arcpy.Buffer_analysis(InputFile,OutputBuffer,size,"FULL","ROUND","NONE","#") 


TheList=os.listdir(SSFlinespath) #read the files in the folder 
os.mkdir(SSFlines+"SSFbuffers"  #create folder for the output 
SSbuff=SSFlinespath+"SSFbuffers/" #select the folder as destination 
try: 
    size=30 
    for TheFile in TheList:           #Identify each file 
     TheFileName, TheFileExtension = os.path.splitext(TheFile) #Break up the file name 
     if (TheFileExtension==".shp"):        #Identify the shapefiles 
      TheLines=SSFlines+TheFile 
      ##Generate a 30m buffer around the lines 
      TheBuffer=SSFbuff+TheFileName+"_buff30.shp" 
      TheStepBuffer.Buffer30m(TheLines,TheBuffer,size) 
      print "SSF buffer done" 
except Exception as TheError: 
    print "Error with the SSF forest area calculation" 
    print TheError 

UPDATE Частичное решение, полный код и новый вопрос:

Я применил предложение qwwqwwq, которая прекрасно работает для функции я уже упоминал ранее. Дело в том, что когда я запускаю оставшуюся часть моего скрипта (то, что я показал раньше, было только частью этого, поэтому вам не пришлось бы так много читать), некоторые из других функций не работают.

Вот полный скрипт:

class StepBuffer: 
def GetPairInfo (self, MainFile, SourceFile, WantFields, SSF): 
    fields= WantFields #Fields I will keep 
    ##Extract the info and add to the main table 
    if SSF==False: 
     GRHE_proj.GetFieldInfo(MainFile,SourceFile,"Pair", "Pair", fields) 
    elif SSF==True: 
     GRHE_proj.GetFieldInfo(MainFile,SourceFile,"SAMPLEID", "SAMPLEID", fields) 

def Buffer30m(self,InputFile,OutputBuffer, size): 
    arcpy.Buffer_analysis(InputFile,OutputBuffer,size,"FULL","ROUND","NONE","#") 

def AreaBuff (self,InputFile, OutputTable):  
    arcpy.CalculateAreas_stats(InputFile,OutputTable) 

def AreaForest (self,BufferFile,ForestFile, OutputTable, SSF): 
    if SSF==False: 
     arcpy.TabulateIntersection_analysis(BufferFile,"Pair",ForestFile,OutputTable,"type","#","#","HECTARES") 
    elif SSF==True: 
     arcpy.TabulateIntersection_analysis(BufferFile,"SAMPLEID",ForestFile,OutputTable,"type","#","#","HECTARES") 



TheList=os.listdir(SSFlinespath) #read the files in the folder 
os.mkdir(SSFlines+"SSFbuffers"  #create folder for the output 
SSbuff=SSFlinespath+"SSFbuffers/" #select the folder as destination 

try: 
    size=30 
    for TheFile in TheList:           #Identify each file 
    TheFileName, TheFileExtension = os.path.splitext(TheFile) #Break up the file name 
    if (TheFileExtension==".shp"):        #Identify the shapefiles 
     TheLines=SSFlines+TheFile 
     ##Generate a 30m buffer around the lines 
       t = threading.Thread(target=TheStepBuffer.Buffer30m, args=(TheLines,TheBuffer,size)) 
       t.start() 
       while (t.is_alive()): 
        time.sleep(2) ## sleep so that we don't execute the print statement too often 
        print "I'm alive!"     
       print "SSF buffer done" 


       ##Calculate area of buffer 
       TableAreaBuff=OutputTables+TheFileName+"_Area_Buffers.dbf"   
       TheStepBuffer.AreaBuff(TheBuffer,TableAreaBuff) 
       print "SSF area buffer done" 

       ##Calculate the area of the forest inside the buffer 
       TableAreaFor=OutputTables+TheFileName+"_Area_forest.dbf" 
       TheStepBuffer.AreaForest(TheBuffer,ForestPath,TableAreaFor,True) 
       print "SSF area forest done" 

       ##Add info of the area of the buffer to the buffer layer 
       TheStepBuffer.GetPairInfo(TheBuffer,TableAreaBuff, "F_AREA",True) 

       ##Add info of area of forest within the buffers to the buffer layer 
       TheStepBuffer.GetPairInfo(TheBuffer,TableAreaFor,["Area","Percentage"],True) 
       print TheFileName+"Done" 
    except Exception as TheError: 
     print "Error with the SSF forest area calculation" 
     print TheError 
     TheErrorFile.writelines(format(TheError)+"\n") 

В частности, ошибка появляется, когда он получает:

TheStepBuffer.AreaForest(TheBuffer,ForestPath,TableAreaFor,True) 

производит эту ошибку:

arcgisscripting.ExecuteError: 
Traceback (most recent call last): 
File "c:\program files (x86)\arcgis\desktop10.1\ 
ArcToolbox\Scripts\CalculateAreas.py", line 76, in <module> 
setupCalcAreas() 
File "c:\program files (x86)\arcgis\desktop10.1\ArcToolbox\Scripts\CalculateAreas.py", line 31, in setupCalcAreas 
calculateAreas(inputFC, outputFC) 
File "c:\program files (x86)\arcgis\desktop10.1\ArcToolbox\Scripts\CalculateAreas.py", line 55, in calculateAreas 
cnt = UTILS.getCount(inputFC) 
File "c:\program files (x86)\arcgis\desktop10.1\ArcToolbox\Scripts\SSUtilities.py", line 502, in getCount 
return int(countObject.getOutput(0)) 
File "C:\Program Files (x86)\ArcGIS\Desktop10.1\arcpy\arcpy\arcobjects\arcobjects.py", line 986, in getOutput ... (truncated) 
return convertArcObjectToPythonObject(self._arc_object.GetOutput(*gp_fixargs(args))) ... (truncated) 
File "C:\Users\Noelia Volpe\Dropbox\Project\analisis\Python_Codes\Scripts\MovementPref\volpe_project_v2.py", line 464, in <module> 
    TheStepBuffer.AreaBuff(TheBuffer,TableAreaBuff) 
File "C:\Users\Noelia Volpe\Dropbox\Project\analisis\Python_Codes\ReUsable\Movement_preferences.py", line 58, in AreaBuff 
    arcpy.CalculateAreas_stats(InputFile,OutputTable) 
File "C:\Program Files (x86)\ArcGIS\Desktop10.1\arcpy\arcpy\stats.py", line 1564, in CalculateAreas 
    raise e 

Кто-нибудь знает, что может быть источником этой ошибки? Спасибо!

+1

Вы должны следовать [Руководству по стилю Python] (http://www.python.org/dev/peps/pep-0008/#method-names-and-instance-variables) для имен переменных - придерживаться 'lower_case_with_underscores 'not' CapWords' - это соглашение об именах используется для классов и может смутить других. –

+0

О, извините. Так я думал в своем классе Python. Они не упоминают соглашения об именах:/Должен ли я изменить его в моем примере? Или я могу оставить его таким? – Noelia

+0

'если программа ANOTHER запущена, а не сам Python' ... непонятно, что вы имеете в виду. процессы выполняются.python - это язык. Если вы хотите выяснить, работает ли процесс, который не является процессом «ДРУГОЙ», он должен означать, что процесс хочет знать, работает ли он сам. хорошо, это похоже на вопрос: «Я жив?» Если вы можете задать этот вопрос, вы. Мыслю, следовательно, существую. – shx2

ответ

2

Я хотел бы попробовать использовать многопоточность:

import threading 
import time 
t = threading.Thread(target=TheStepBuffer.Buffer30m, args=(TheLines,TheBuffer,size)) 
t.start() 

while (t.is_alive()): 
    time.sleep(2) ## sleep so that we don't execute the print statement too often 
    print "I'm alive!" 

Ваш поток будет выполнять функцию TheStepBuffer.Buffer30m, а поток управления будет контролировать этот поток, чтобы убедиться, что он по-прежнему выполняет свою целевую функцию, выполняя print заявление дайте знать, что все в порядке.

+0

Вау! Благодаря! Это именно то решение, которое я искал. У меня есть вопрос: нужно ли нам «кончить» поток потом? (Я предполагаю это, потому что мы «начали» его с помощью 't.start()'). Я спрашиваю об этом, потому что, когда я пытаюсь запустить еще одну дуговую функцию позже в скрипте, он дает мне ошибку (см. Мое редактирование на вопрос выше), и мне интересно, связано ли это с тем, что созданный нами поток все еще вокруг. Благодаря! – Noelia

+0

Нет, нам не нужно заканчивать нить. Вы можете думать о потоке, поскольку процесс прыгает назад и вперед между двумя полностью отдельными программами. Когда одна программа достигает своего завершения, процесс не собирается тратить больше времени на этот поток, так что это похоже на то, что он не работает эффективно. Используя цикл while, мы эффективно ожидаем завершения потока, другим способом это t.join(). Ваша другая ошибка не связана, похоже, что одна из функций дуги просто повышает исключение в соответствии с этой трассировкой. – qwwqwwq

+0

О! Понимаю. Дело в том, что я получаю это сообщение об ошибке, только если я делаю поток. Если я запускаю его нормально, это работает, поэтому я предполагаю, что должна быть какая-то остаточная память, которая мешает другой функции. Как вы думаете, я должен открыть новый вопрос, чтобы получить помощь? – Noelia

Смежные вопросы