Многопроцессорный запуск arcpy python из командного файла

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

ИЗМЕНИТЬ

Код был отредактирован, чтобы отразить текущее состояние после предложений.

Итак, теперь я вижу, что часть моей проблемы заключается в том, что я пытаюсь преобразовать цикл for в многопроцессорный. Там, где я мог бы использовать инкрементную переменную через x = x+1 для изменения имен выходных файлов, теперь мне нужно найти другой способ сделать это. Но это еще не вся проблема. Я пытался использовать enumerate, но это тоже не работает.

Код пакетного файла:

C:\PathToArcPython2.7-64bit C:\PathtoScript3

Попытка многопроцессорной обработки кода Script 3:

import arcpy
import os
import fnmatch
import sys
import multiprocessing
#==============================================================================     
working_dir = r'E:\PathToDir'
output_dir = os.path.join(working_dir, 'Results')
if not os.path.isdir(output_dir):
    os.mkdir(output_dir)
#============================================================================== 
global input_files5
global input_files6
input_files5 = []
input_files6 = []
#==============================================================================
for r, d, f in os.walk(output_dir):
    for inFile in fnmatch.filter(f, '*Processed.shp'):
        input_files5.append(os.path.join(r, inFile))

global num
num = enumerate([0,1])

def Script(file):
    name = output_dir + "\\" + "Prefix" + str(num) + "Script.shp"
    arcpy.Tool(file, name,"","", "Field1;Field2") 
    input_files6.append(name)
    print "Script " + str(num)

def MCprocess():
    pool = multiprocessing.Pool(processes=4)
    pool.map(Script, input_files5)

if __name__ == '__main__':
    working_dir = r'E:\PathToDir'
    output_dir = os.path.join(working_dir, 'Results')
    input_files5 = []
    input_files6 = []
    for r, d, f in os.walk(output_dir):
        for inFile in fnmatch.filter(f, '*Processed.shp'):
            input_files5.append(os.path.join(r, inFile))
    MCprocess()

StackTraceError

Traceback (most recent call last):
  File "Path\To\Script.py", line 55, in <module>
    MCprocess()
  File "Path\To\Script.py", line 41, in MCprocess
    pool.map(Script, input_files5)
  File "C:\Python27\ArcGISx6410.5\lib\multiprocessing\pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "C:\Python27\ArcGISx6410.5\lib\multiprocessing\pool.py", line 567, in get
    raise self._value
ExecuteError: ERROR 000210: Cannot create output 
Path\To\File\Prefix_<enumerate object at 0x0000000012CCB678>Suffix.shp
Failed to execute (Script).

person NorthLand    schedule 15.12.2017    source источник
comment
Не могли бы вы опубликовать ошибку? И проверьте, есть ли что-нибудь в args после того, как вы его установили? Возможно, вам просто нужно добавить «глобальные input_files5» после def MCprocess():   -  person Ian E    schedule 16.12.2017
comment
@IanE Ошибка, которую я сейчас получаю при построчном вводе в экземпляр Python, происходит следующим образом. Когда я завершаю определение MCprocess, я набираю McProcess(). Ошибка AttributeError: объект 'module' не имеет атрибута 'Medcen'   -  person NorthLand    schedule 18.12.2017
comment
Трассировки стека? Мне нужно больше информации. Вы пробовали не устанавливать target=Medcen, а просто поместить Medcen в pool.map()?   -  person Ian E    schedule 18.12.2017
comment
Я действительно не знаю, как сделать трассировку стека. Я исхожу из фона типа ГИС, поэтому я немного пятнистый в чем-то. Ошибка трассировки больше не появлялась. Я попытался без определения цели и аргументов, а просто поместил Medcen и input_files5 непосредственно в pool.map EDIT: ошибка трассировки появляется только при запуске из командного файла.   -  person NorthLand    schedule 18.12.2017
comment
Добавлена ​​​​ошибка после разработки, как распечатать ее в файл журнала.   -  person NorthLand    schedule 18.12.2017
comment
@IanE Я сузил текущую ошибку до того, как я пытаюсь повторить / увеличить имя.   -  person NorthLand    schedule 18.12.2017
comment
Да, похоже, вы получаете доступ/изменяете его с помощью нескольких потоков одновременно. Я бы посмотрел на эксклюзивные замки. Я не делал много блокировок в python (поэтому не используйте это как фактический код), но он должен выглядеть примерно так: 1) заблокировать число 2) увеличить число 3) сохранить значение числа локально для использования 4) разблокировать число   -  person Ian E    schedule 18.12.2017
comment
@IanE Я нашел способ сделать это без блокировки. Смотрите ответ ниже.   -  person NorthLand    schedule 19.12.2017


Ответы (1)


Проблема заключалась в попытке выполнить итерацию так же, как и в цикле for. Вместо этого я решил сделать это с оригинальными именами файлов, которые на данном этапе обработки уже уникальны. Соответствующий код ниже.

def Medcen(file):

    filename = str(file)
    filename = filename.split('\\')
    filename = filename[-1]
    filename = filename.strip('Processed.shp')

    name = output_dir + "\\" + str(filename) + "MedCen.shp"

    arcpy.MedianCenter_stats(file, name,"","", "Field1;Field2") 
    input_files6.append(name)
    print "Med Cen " + str(filename)
person NorthLand    schedule 18.12.2017