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.