ArcPy के साथ एक और पायथन स्क्रिप्ट के भीतर पायथन स्क्रिप्ट (मापदंडों के साथ) चल रहा है?


23

एएमएल में उपयोग किया जाने वाला एक सामान्य कोडिंग पैटर्न एक अन्य एएमएल के अंदर एएमएल (मापदंडों के साथ) को चलाने के लिए था।

एक एप्लिकेशन जो मैं वर्तमान में विकसित कर रहा हूं वह एक और पायथन स्क्रिप्ट के भीतर पायथन स्क्रिप्ट (मापदंडों के साथ) को चलाने में सक्षम होने से लाभ होगा।

हालाँकि, यह बिल्कुल सीधा नहीं लगता है।

ArcGIS 10 का उपयोग करते हुए, मैं "आंतरिक" पायथन स्क्रिप्ट को एक ArcGIS टूल में लपेटने के साथ प्रयोग कर रहा हूं जिसमें पैरामीटर हैं। मुझे लगा कि टूलबॉक्स को इम्पोर्ट करने के लिए "बाहरी" पायथन स्क्रिप्ट का उपयोग करना बहुत आसान होगा। हालांकि, परीक्षण में अब तक "बाहरी" स्क्रिप्ट से "इनर" टूल को चलाने के मेरे सभी प्रयास केवल "इनर" टूल को छोड़ना प्रतीत होता है (कोई त्रुटि नहीं है)।

यहाँ कुछ परीक्षण कोड की कोशिश की गई है और बेहतर वर्णन करने के लिए कि मैं क्या वर्णन करने की कोशिश कर रहा हूँ।

मेरी testinner.py स्क्रिप्ट है:

inputString = arcpy.GetParameterAsText(0)

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

मेरी टेस्ट राउटरफ़्लो स्क्रिप्ट है:

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 को केवल एक खाली सुविधा वर्ग की आवश्यकता होती है जिसे परीक्षण कहा जाता है।

एक बार जब आप उपरोक्त इकट्ठे हो जाते हैं, तो टेस्टिनर टूल को एक स्ट्रिंग जैसे 'एबीसी' के साथ चला रहे हैं, क्योंकि इसके पैरामीटर को फीचर क्लास 'टेस्ट' में कॉपी किया जाना चाहिए, जिसे 'एबीसी' ओके कहा जाता है।

लेकिन जब आप 'uvw' और 'xyz' जैसे दो स्ट्रिंग्स के साथ टेस्टिंग राउटर टूल को अपने मापदंडों के रूप में चलाने का प्रयास करते हैं, तो टेस्ट राउटर के भीतर वाला टेस्टिकलर टूल एक बार ओके लगता है, लेकिन जब Vista SP2 पर आर्कपॉम 10 SP2 को एक सीरियस एप्लिकेशन त्रुटि के लिए भेजता है। दूसरी बार इसका उपयोग करने की कोशिश कर रहा है।

Windows XP SP3 और ArcGIS डेस्कटॉप 10 SP2 का उपयोग करने वाली समान परीक्षा भी एक ही बिंदु पर एक गंभीर एप्लिकेशन त्रुटि पैदा करती है।


2
इस पर @ दान के जवाब के साथ जा रहे हैं ... "स्क्रिप्ट्स" के रूप में .py फाइलों के बारे में न सोचें, उन्हें उन मॉड्यूल के रूप में सोचें जिन्हें आप उन मॉड्यूल से आवश्यक कार्यों और वर्गों को आयात करके पुन: उपयोग और पुनरावृत्ति कर सकते हैं। उन एनपीटी मापदंडों को दूर करें जो एक स्क्रिप्ट का उपयोग मापदंडों के एक सेट में पढ़ने के लिए करते हैं और फिर आवश्यकतानुसार अन्य मॉड्यूल में फ़ंक्शन को कॉल करते हैं। का प्रयोग करें अगर नाम __ == '__ मुख्य ' अपने मॉड्यूल दोनों आयात योग्य है और अभी भी useable स्टैंडअलोन बनाने के लिए चाल।
ब्लाह 238

मेरे पास आउटपुट के लिए काम करने वाले दान का उदाहरण है: C: \ Temp \ Main_program.py ('सम नंबर्स:', 55) ('स्क्वेयर का योग: ’, ३ )५) (' हैलो से 8: ', [1, 2, 3) , 4, 5, 6, 7, 8, 9, 10]) लेकिन मैं इसे एक आर्कपी उदाहरण के लिए अनुकूलित करने के लिए संघर्ष कर रहा हूं जैसे मैंने ऊपर दिया था। क्या एक ArcPy उदाहरण की तरह लगेगा पर किसी भी आगे की मदद की बहुत सराहना की जाएगी।
PolyGeo

मैंने जो उत्तर दिया, उसे देखें - अपने उदाहरण के संदर्भ में चीजों को बेहतर तरीके से समझाने में मदद करें।
ब्लाह 238

मैं अभी जेसन पेर्डी के एक उत्कृष्ट ब्लॉग पोस्ट पर आया हूँ जो कि ब्लॉगस्पेस .esri.com
Dev

यह लिंक तब से स्थानांतरित हो गया है, और मुझे विश्वास है कि यह अब यहाँ टिकी हुई है: 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)

मुझे लगता है कि एक बार जब आप इसका उपयोग कर लेते हैं तो आप इस मॉड्यूलर दृष्टिकोण को बहुत अधिक कुशल और तार्किक पाएंगे। मानक पायथन ट्यूटोरियल में मॉड्यूल अनुभाग भी कैसे समझ आयात करने का काम करता है के लिए एक अच्छा स्रोत है।

अधिक चापलूसी-विशिष्ट उदाहरणों के लिए अपने 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

आपको बस यह सुनिश्चित करना है कि मुख्य मॉड्यूल और चाइल्ड मॉड्यूल एक ही फ़ोल्डर में हैं। आप आसानी से चाइल्ड मॉड्यूल के मापदंडों को पास कर सकते हैं और अगर चाइल्ड मॉड्यूल को आर्कपी (आप 10 सेमी arcmap के संस्करण का उपयोग कर रहे हैं) तक पहुंच की आवश्यकता है, तो बस इसके संदर्भ में पास करें।


6

किसी फ़ंक्शन को आयात करना और चलाना यह करने के लिए क्लीनर तरीका है, लेकिन पूर्णता के लिए, execfileअंतर्निहित फ़ंक्शन ( प्रलेखन ) भी है जो आपको वर्तमान संदर्भ में एक मनमानी फ़ाइल चलाने देगा।


0

Execfile विधि @JasonScheirer द्वारा वर्णित मुझे उस नीचे करने के लिए अपने कोड को पुनर्व्यवस्थित करने की अनुमति दी और अपने परीक्षण समस्या का समाधान प्रदान करता है:

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

हालाँकि, यह गैर-परीक्षण स्क्रिप्ट (ओं) पर लागू होने पर बोझिल साबित हो सकता है जो कि बहुत लंबे समय तक हैं इसलिए मैंने @ blah238 के काम का उपयोग किया है जो @ DanPatterson के दृष्टिकोण का समर्थन करता है और निम्नलिखित अंतिम (परीक्षण) कोड के साथ आया है जो वास्तव में मुझे चाहिए।

# 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.