24 votos

ArcPy y ejecución de secuencias de comandos de Python (con parámetros) dentro de otra secuencia de comandos de Python

Un común patrón de codificación utilizado en la LMA fue a ejecutar un AML (con parámetros) dentro de otra AML.

Una aplicación que estoy desarrollando actualmente, tendría el beneficio de ser capaz de ejecutar una secuencia de comandos de Python (con parámetros) dentro de otra secuencia de comandos de Python.

Sin embargo, esto no parece ser del todo sencillo.

El uso de ArcGIS 10, estoy experimentando con envolver el "interior" de la secuencia de comandos de Python en ArcGIS herramienta que tiene los parámetros. Pensé que iba a ser una simple cuestión de tener el "exterior" de secuencia de comandos de Python uso de arcpy.ImportToolbox importar el cuadro de herramientas y, a continuación, ejecute la herramienta(s) dentro de ella. Sin embargo, en las pruebas hasta ahora todos mis intentos para ejecutar el "interior" de la herramienta desde el "exterior" de script parecen simplemente omitir el "interior" de la herramienta (no se produce ningún error).

Alguna idea de cómo hacer esto son bienvenidos. En el mientras tanto, voy a tratar de crear una simple código de prueba para ilustrar mejor lo que estoy tratando de describir.

El código de la prueba ya está aquí ...

Mi testinner.py secuencia de comandos es:

inputString = arcpy.GetParameterAsText(0)

newFC = "C:\\Temp\\test.gdb\\" + inputString
arcpy.Copy_management("C:\\Temp\\test.gdb\\test",newFC)

Mi testouter.py secuencia de comandos es:

import arcpy

inputString1 = arcpy.GetParameterAsText(0)
inputString2 = arcpy.GetParameterAsText(1)

arcpy.ImportToolbox("C:\\Temp\\test.tbx")

arcpy.testinner_test(inputString1)

arcpy.testinner_test(inputString2)

Para testinner.py sus necesidades de herramientas de un solo parámetro de Cadena.

Para testouter.py su herramienta necesita dos parámetros de Cadena de

Las dos herramientas se colocan en una prueba.tbx.

La prueba.gdb sólo necesita una única característica de vacío de la clase se llama prueba.

Una vez que usted tiene la montada, la ejecución de la testinner herramienta con una cadena como 'abc' pasa como parámetro debe resultar en la clase de entidad de 'prueba' de copiarse a uno llamado 'abc' OK.

Pero cuando intente ejecutar la testouter herramienta con dos cadenas como 'uvw' y 'xyz' como sus parámetros, la testinner herramienta dentro de testouter.py parece funcionar OK una vez, pero envía a ArcMap 10 SP2 en windows Vista SP2 a un Grave Error de Aplicación cuando tratando de utilizar el segundo tiempo.

La misma prueba utilizando Windows XP SP3 y ArcGIS Desktop 10 SP2 también produce un Grave Error de Aplicación en el mismo punto.

================================================================================

El execfile método descrito por Jason me permitió cambiar mi código a la de abajo y proporciona una solución a mi problema:

import arcpy

inputString1 = arcpy.GetParameterAsText(0)
inputString2 = arcpy.GetParameterAsText(1)

arcpy.ImportToolbox("H:/Temp/test.tbx")

# Write second Python script to an ASCII file for first parameter & execute it
f = open("H:/Temp/string1.py","w")
f.write('newFC = "H:/Temp/test.gdb/' + inputString1 + '"' + "\n")
f.write('arcpy.Copy_management("H:/Temp/test.gdb/test"' + ',newFC)')
f.close()
execfile("H:/Temp/string1.py")

# Write third Python script to an ASCII file for second parameter & execute it
f = open("H:/Temp/string2.py","w")
f.write('newFC = "H:/Temp/test.gdb/' + inputString2 + '"' + "\n")
f.write('arcpy.Copy_management("H:/Temp/test.gdb/test"' + ',newFC)')
f.close()
execfile("H:/Temp/string2.py")

Sin embargo, esto puede resultar engorroso cuando se aplica a los no-script de prueba(s) que son mucho más de lo que he usado blah238 generoso de trabajo que suscribió Dan enfoque (Jason también aprobó Dan el enfoque puedo agregar) y se llegó a la siguiente final (examen) código que hace exactamente lo que necesito.

================================================================================

# CopyFeaturesTool.py

import CopyFeaturesUtility
import arcpy
outputFCName = arcpy.GetParameterAsText(0)
outputFCName2 = arcpy.GetParameterAsText(1)

CopyFeaturesUtility.copyFeaturesToTempGDB("C:\\Temp\\test.gdb\\test", outputFCName)
CopyFeaturesUtility.copyFeaturesToTempGDB("C:\\Temp\\test.gdb\\test", outputFCName2)

y

# CopyFeaturesUtility.py

import arcpy
import os

def copyFeaturesToTempGDB(inputFeatures, outputName):
    """Copies the input features to a temporary file geodatabase.
    inputFeatures: The input feature class or layer.
    outputName: The name to give the output feature class."""

    tempGDB = r"C:\Temp\test.gdb"
    newFC = os.path.join(tempGDB, outputName)
    arcpy.env.overwriteOutput = True
    arcpy.Copy_management(inputFeatures, newFC)

if __name__ == '__main__':
    inputFC = r"C:\Temp\test.gdb\test"
    outputFCName = arcpy.GetParameterAsText(0)
    copyFeaturesToTempGDB(inputFC, outputFCName)

Muchas gracias a Dan, Jason y blah238 para ayudarme.

17voto

auramo Puntos 161

Aquí está la prueba de ejemplo modificado para importar una "utilidad" del módulo dentro del script principal y llamar a una función con los parámetros de lectura en la herramienta de secuencia de comandos:


CopyFeaturesTool.py - herramienta de secuencia de Comandos en la que se lee en los parámetros y llama a una función en otro módulo

import CopyFeaturesUtility
import arcpy

inputFC = arcpy.GetParameterAsText(0)
outputFCName = arcpy.GetParameterAsText(1)
CopyFeaturesUtility.copyFeaturesToTempGDB(inputFC, outputFCName)

CopyFeaturesUtility.py - Módulo que tiene una sola función copyFeaturesToTempGDB. Puede ser importado o de ejecución independiente. Si se ejecuta independiente el código en if __name__ == '__main__' se ejecuta.

import arcpy
import os

def copyFeaturesToTempGDB(inputFeatures, outputName):
    """Copies the input features to a temporary file geodatabase.
    inputFeatures: The input feature class or layer.
    outputName: The name to give the output feature class."""

    tempGDB = r"c:\temp\test.gdb"
    newFC = os.path.join(tempGDB, outputName)
    arcpy.env.overwriteOutput = True
    arcpy.CopyFeatures_management(inputFeatures, newFC)

if __name__ == '__main__':
    inputFC = r"c:\temp\test.gdb\test"
    outputFCName = "testCopy"
    copyFeaturesToTempGDB(inputFC, outputFCName)

Creo que usted encontrará que este enfoque modular para ser mucho más eficiente y lógica una vez que te has acostumbrado a ella. La sección de Módulos en el estándar de Python tutorial es también un buen recurso para la comprensión de cómo la importación de obras.

Para obtener más arcpy ejemplos concretos de echar un vistazo a las secuencias de comandos integradas en su C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts carpeta.

13voto

Jim Puntos 4057

Usted puede lograr esto mediante la importación de un módulo (es decir, la secuencia de comandos) en su script principal y llamar a sus funciones. Una simple demo está contenida en el acompañamiento a los dos scripts.

    '''
Main_program.py

demonstrates how to import and call functions from another module
'''
import sys
import CallingFunctions

a_list = [1,2,3,4,5,6,7,8,9,10]
print sys.argv[0]
print CallingFunctions.func1(a_list)
print CallingFunctions.func5(a_list)
print CallingFunctions.func8(a_list)

para el programa principal y de las funciones que están llamados

'''
Callingfunctions.py

imported into another program giving it access to the functions
'''

def func1(inputs=None):
  x = sum(inputs)
  return "sum some numbers: ", x
'''
more functions
'''
def func5(inputs=None):
  x_sq = 0
  for x in inputs:
    x_sq += x**2
  return "sum of squares: ", x_sq
'''
more functions
'''
def func8(inputs=None):
  return "hello from 8: ", inputs

'''
more functions
'''
if __name__ == "__main__":
  a_list = [1,2,3,4,5,6,7,8,9,10]
  inputs = "test inputs"
  a_dict = {1:[func1([1,2,3]) ],
            5:[func5([1,2,3])],
            8:[func8("inputs to 8")]}
  needed = [1,5,8]
  for akey in needed:
    if akey in a_list:
      action = a_dict[akey]
      print "\naction: ", action

usted sólo tiene que asegurarse de que el módulo principal y el niño módulo están en la misma carpeta. Puede pasar parámetros a los que el niño módulo fácilmente y si el niño módulo de necesidades de acceso a arcpy (asumiendo que usted está utilizando la versión 10 de arcmap) simplemente pasar una referencia a él.

6voto

Paul Puntos 555

La importación y la ejecución de una función es la más limpia de hacerlo, pero en aras de la exhaustividad, también existe la execfile función integrada (documentación) que permite ejecutar un archivo arbitrario en el contexto actual.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X