Un patrón de codificación común utilizado en AML era ejecutar un AML (con parámetros) dentro de otro AML.
Una aplicación que estoy desarrollando actualmente se beneficiaría de poder ejecutar un script Python (con parámetros) dentro de otro script Python.
Sin embargo, esto no parece ser del todo sencillo.
Usando ArcGIS 10, estoy experimentando con envolver el script Python "interno" en una herramienta ArcGIS que tiene los parámetros. Pensé que sería simple hacer que el script Python "externo" use arcpy.ImportToolbox para importar la caja de herramientas y luego ejecutar las herramientas dentro de ella. Sin embargo, en las pruebas realizadas hasta ahora, todos mis intentos de ejecutar la herramienta "interna" desde el script "externo" parecen omitir simplemente la herramienta "interna" (no se produce ningún error).
Aquí hay un código de prueba para tratar de ilustrar mejor lo que estoy tratando de describir.
Mi script testinner.py es:
inputString = arcpy.GetParameterAsText(0)
newFC = "C:\\Temp\\test.gdb\\" + inputString
arcpy.Copy_management("C:\\Temp\\test.gdb\\test",newFC)
Mi script testouter.py 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 su herramienta necesita un único parámetro de cadena.
Para testouter.py su herramienta necesita dos parámetros de cadena
Las dos herramientas se colocan en un test.tbx.
Test.gdb solo necesita una única clase de entidad vacía llamada test.
Una vez que haya ensamblado lo anterior, ejecute la herramienta testinner con una cadena como 'abc' ya que su parámetro debería hacer que la clase de entidad 'prueba' se copie en una llamada 'abc' OK.
Pero cuando intenta ejecutar la herramienta Testouter con dos cadenas como 'uvw' y 'xyz' como sus parámetros, la herramienta testinner dentro de testouter.py parece ejecutarse una vez, pero envía ArcMap 10 SP2 en Vista SP2 a un error de aplicación grave cuando tratando de usarlo la segunda vez.
La misma prueba con Windows XP SP3 y ArcGIS Desktop 10 SP2 también produce un error grave de la aplicación en el mismo punto.
Respuestas:
Aquí está su ejemplo de prueba modificado para importar un módulo de "utilidad" dentro del script principal y llamar a una función usando los parámetros leídos por la herramienta de script:
CopyFeaturesTool.py : herramienta de script que lee parámetros y llama a una función en otro módulo
CopyFeaturesUtility.py - Módulo que tiene una sola función
copyFeaturesToTempGDB
. Se puede importar o ejecutar de forma independiente. Si se ejecuta de forma independiente, se ejecuta el código debajoif __name__ == '__main__'
.Creo que este enfoque modular será mucho más eficiente y lógico una vez que se haya acostumbrado. La sección Módulos en el tutorial estándar de Python también es un buen recurso para comprender cómo funciona la importación.
Para obtener ejemplos más específicos de arcpy, eche un vistazo a los scripts integrados en su
C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts
carpeta.fuente
Puede lograr esto importando un módulo (es decir, un script) en su script principal y llamando a sus funciones. Una demostración simple está contenida en los dos scripts que la acompañan.
para el programa principal y para las funciones que se llaman
solo tiene que asegurarse de que el módulo principal y el módulo secundario estén en la misma carpeta. Puede pasar parámetros al módulo secundario fácilmente y si el módulo secundario necesita acceso a arcpy (suponiendo que esté utilizando la versión 10 de arcmap) simplemente pase una referencia al mismo.
fuente
Importar y ejecutar una función es la forma más limpia de hacerlo, pero en aras de la exhaustividad, también existe la
execfile
función incorporada ( documentación ) que le permitirá ejecutar un archivo arbitrario en el contexto actual.fuente
El método execfile descrito por @JasonScheirer me permitió reorganizar mi código a continuación y proporciona una solución a mi problema de prueba:
Sin embargo, esto puede resultar engorroso cuando se aplica a scripts que no son de prueba, que son mucho más largos, por lo que utilicé el trabajo de @ blah238 que avaló el enfoque de @ DanPatterson y obtuve el siguiente código final (prueba) que hace exactamente lo que necesito.
y
fuente