ArcPy를 사용하여 다른 Python 스크립트 내에서 Python 스크립트 (매개 변수 포함)를 실행 하시겠습니까?


23

AML에 사용되는 일반적인 코딩 패턴은 다른 AML 내에서 AML (매개 변수 포함)을 실행하는 것이 었습니다.

현재 개발중인 응용 프로그램은 다른 Python 스크립트 내에서 Python 스크립트 (매개 변수 포함)를 실행할 수 있다는 이점이 있습니다.

그러나 이것은 전혀 간단하지 않은 것 같습니다.

ArcGIS 10을 사용하여 "내부"Python 스크립트를 매개 변수가있는 ArcGIS 도구에 래핑하는 방법을 실험하고 있습니다. "외부"Python 스크립트가 arcpy.ImportToolbox를 사용하여 도구 상자를 가져온 다음 도구 상자 내에서 도구를 실행하는 것이 간단한 문제라고 생각했습니다. 그러나 지금까지 테스트에서 "외부"스크립트에서 "내부"도구를 실행하려는 모든 시도는 단순히 "내부"도구를 건너 뛰는 것처럼 보입니다 (오류가 발생하지 않습니다).

여기에 내가 설명하려고하는 것을 더 잘 설명하고 설명하기위한 테스트 코드가 있습니다.

내 testinner.py 스크립트는 다음과 같습니다

inputString = arcpy.GetParameterAsText(0)

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

내 testouter.py 스크립트는 다음과 같습니다

import arcpy

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

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

arcpy.testinner_test(inputString1)

arcpy.testinner_test(inputString2)

testinner.py의 경우 해당 도구에는 단일 문자열 매개 변수가 필요합니다.

testouter.py의 경우 도구에 두 개의 문자열 매개 변수가 필요합니다

두 도구는 test.tbx에 있습니다.

test.gdb에는 test라는 빈 피처 클래스 하나만 있으면됩니다.

위의 어셈블이 완료되면 매개 변수로 전달 된 'abc'와 같은 문자열로 testinner 도구를 실행하면 기능 클래스 'test'가 'abc'라는 이름으로 복사됩니다.

그러나 'uvw'와 'xyz'와 같은 두 개의 문자열을 매개 변수로 사용하여 testouter 도구를 실행하려고하면 testouter.py 내의 testinner 도구가 한 번만 실행되는 것처럼 보이지만 Vista SP2의 ArcMap 10 SP2를 심각한 응용 프로그램 오류로 보냅니다. 두 번째로 사용하려고합니다.

Windows XP SP3 및 ArcGIS Desktop 10 SP2를 사용한 동일한 테스트에서도 같은 시점에 심각한 응용 프로그램 오류가 발생합니다.


2
@Dan의 대답에 따라 ... .py 파일을 "스크립트"로 생각하지 말고 해당 모듈에서 필요한 함수와 클래스를 가져 와서 재사용하고 재활용 할 수있는 모듈로 생각하십시오. 하나의 스크립트를 사용하여 하나의 매개 변수 세트를 읽은 다음 필요에 따라 다른 모듈에서 함수를 호출하여 중첩 된 GP 매개 변수를 추상화하십시오. 사용 하는 경우 이름 __ == '__ 주 ' 당신의 모듈을 모두 가져올 수 여전히 사용 가능한 독립를 만들기 위해 트릭을.
blah238

C : \ Temp \ Main_program.py ( '일부 숫자 :', 55) ( '제곱의 합 :', 385) ( 'hello from 8 :', [1, 2, 3) , 4, 5, 6, 7, 8, 9, 10])하지만 위에서 설명한 ArcPy 예제에 적용하기 위해 고심하고 있습니다. ArcPy 예제의 모양에 대한 추가 도움이 있으면 대단히 감사하겠습니다.
PolyGeo

내가 추가 한 답변을 참조하십시오. 귀하의 모범과 관련하여 더 잘 설명해 줄 것입니다.
blah238

방금 blogs.esri.com/Dev/blogs/geoprocessing/archive/2011/07/21/…에서 Python 모듈의 코딩 패턴을 통합하는 ArcPy 템플릿을 제공하는 Jason Pardy의 훌륭한 블로그 게시물을 보았습니다.
PolyGeo

이 링크는 이후 이동, 나는 지금 여기에 달려있다 생각했습니다 blogs.esri.com/esri/arcgis/2011/08/04/pythontemplate
ndimhypervol을

답변:


15

다음은 기본 스크립트 내에서 "유틸리티"모듈을 가져오고 스크립트 도구에서 읽은 매개 변수를 사용하여 함수를 호출하도록 수정 된 테스트 예제입니다.


CopyFeaturesTool.py- 매개 변수를 읽고 다른 모듈에서 함수를 호출하는 스크립트 도구

import CopyFeaturesUtility
import arcpy

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

CopyFeaturesUtility.py- 단일 기능을 가진 모듈 copyFeaturesToTempGDB. 가져 오거나 독립형으로 실행할 수 있습니다. 독립형으로 실행하면 아래 코드 if __name__ == '__main__'가 실행됩니다.

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)

이 모듈 식 접근 방식은 익숙해지면 훨씬 효율적이고 논리적이라고 생각합니다. 표준 Python 튜토리얼모듈 섹션 가져 오기 작동 방식을 이해하는 데 유용한 리소스입니다.

더 복잡한 예제는 C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts폴더 의 내장 스크립트를 살펴보십시오 .


13

모듈 (예 : 스크립트)을 기본 스크립트로 가져 와서 해당 기능을 호출하면됩니다. 간단한 데모가 두 개의 스크립트에 포함되어 있습니다.

    '''
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)

메인 프로그램과 호출되는 기능

'''
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

메인 모듈과 자식 모듈이 같은 폴더에 있는지 확인하면됩니다. 하위 모듈에 매개 변수를 쉽게 전달할 수 있으며 하위 모듈이 arcpy에 액세스해야하는 경우 (아크 맵의 버전 10을 사용한다고 가정) 간단히 참조를 전달하십시오.


6

함수를 가져오고 실행하는 것이 더 깔끔한 방법이지만 완전성을 위해 현재 컨텍스트에서 임의의 파일을 실행할 수 있는 execfile내장 함수 ( documentation )도 있습니다.


0

@JasonScheirer 설명 execfile 방법은 저 아래 그에게 내 코드를 재 배열 할 수 내 시험 문제에 대한 해결책을 제공합니다 :

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")

그러나 이것은 테스트가 아닌 스크립트에 적용될 때 성가신 일이 될 수 있으므로 @ DanPatterson의 접근 방식 을 승인 한 @ blah238의 작업 을 사용 하고 정확히 필요한 것을 수행하는 다음 최종 (테스트) 코드를 생각해 냈습니다.

# 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)

# 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.