আরকপাইয়ের সাহায্যে পাইথন স্ক্রিপ্টগুলি (পরামিতি সহ) অন্য পাইথন স্ক্রিপ্টের মধ্যে চলছে?


23

এটিএমএলে ব্যবহৃত একটি সাধারণ কোডিং প্যাটার্নটি ছিল অন্য একটি এএমএলের ভিতরে একটি এএমএল (পরামিতি সহ) চালানো।

আমি বর্তমানে যে অ্যাপ্লিকেশনটি বিকাশ করছি তা অন্য পাইথন স্ক্রিপ্টের মধ্যে পাইথন স্ক্রিপ্ট (পরামিতি সহ) চালাতে সক্ষম হয়ে উপকৃত হবে।

তবে এটি মোটেও সহজবোধ্য বলে মনে হয় না।

আরকজিআইএস 10 ব্যবহার করে, আমি "অভ্যন্তরীণ" পাইথন স্ক্রিপ্টটি একটি আর্কজিআইএস সরঞ্জামে মোড়ানোর জন্য পরীক্ষা করছি যা পরামিতি রয়েছে। আমি ভেবেছিলাম "বাইরের" পাইথন স্ক্রিপ্টটি আরকিপি ব্যবহার করা উচিত। টুলবক্সটি আমদানি করার জন্য ইমপোর্টটুলবক্স এবং তারপরে সরঞ্জাম (গুলি) চালানো। তবে, পরীক্ষার ক্ষেত্রে এখনও পর্যন্ত "বাইরের" স্ক্রিপ্ট থেকে "অভ্যন্তরীণ" সরঞ্জামটি চালনার সমস্ত প্রচেষ্টা কেবল "অভ্যন্তরীণ" সরঞ্জামটি এড়িয়ে চলেছে (কোনও ত্রুটি নিক্ষেপ করা হয় না)।

আমি কী বর্ণনা করতে চাইছি তা আরও ভাল করে বোঝানোর জন্য এখানে কিছু টেস্ট কোড দেওয়া আছে।

আমার টেস্টিনার.পি স্ক্রিপ্টটি হ'ল:

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 এর জন্য তার সরঞ্জামটির জন্য একটি একক স্ট্রিং প্যারামিটার প্রয়োজন।

টেস্টাউটার.পি এর জন্য তার সরঞ্জামটির জন্য দুটি স্ট্রিং পরামিতি প্রয়োজন

দুটি সরঞ্জাম একটি test.tbx এ রাখা হয়েছে।

Test.gdb- র জন্য কেবলমাত্র একক খালি বৈশিষ্ট্য বর্গের পরীক্ষা প্রয়োজন called

একবার আপনি উপরোক্ত একত্রিত হয়ে গেলে, পরীক্ষকের সরঞ্জামটি 'পিসি' এর মতো একটি স্ট্রিং দিয়ে চালিত হওয়ার সাথে সাথে তার প্যারামিটারটি বৈশিষ্ট্য বর্গের 'পরীক্ষার' কপি করা যেতে পারে, যার নাম 'এবিসি' ঠিক আছে to

কিন্তু যখন আপনি 'uvw' এবং 'xyz' এর মতো দুটি স্ট্রিং দিয়ে টেস্টিওটার সরঞ্জামটিকে তার পরামিতি হিসাবে চালানোর চেষ্টা করেন, টেস্টআউট.পি এর মধ্যে থাকা টেস্টাইনার সরঞ্জামটি একবারে ঠিক আছে বলে মনে হয়, তবে ভিস্তার এসপি 2 তে আর্কম্যাপ 10 এসপি 2 একটি গুরুতর অ্যাপ্লিকেশন ত্রুটিতে প্রেরণ করে যখন দ্বিতীয়বার এটি ব্যবহার করার চেষ্টা করছি।

উইন্ডোজ এক্সপি এসপি 3 এবং আরকজিআইএস ডেস্কটপ 10 এসপি 2 ব্যবহার করে একই পরীক্ষা একই পয়েন্টে একটি গুরুতর অ্যাপ্লিকেশন ত্রুটি তৈরি করে।


2
এ সম্পর্কে @ ড্যানের উত্তর নিয়ে যাচ্ছেন ... .পি ফাইলগুলিকে কেবল "স্ক্রিপ্ট" হিসাবে ভাবেন না, সেগুলি মডিউলগুলি হিসাবে আপনি সেইগুলি মডিউলগুলি থেকে আপনার প্রয়োজনীয় ফাংশন এবং শ্রেণিগুলি আমদানি করে পুনরায় ব্যবহার করতে এবং পুনর্ব্যবহার করতে পারেন তা ভাবেন না। প্যারামিটারগুলির একটি সেটে পড়ার জন্য একটি স্ক্রিপ্ট ব্যবহার করে সেই নেস্টেড জিপি প্যারামিটারগুলি অ্যাবস্ট্রাক্ট করুন এবং তারপরে প্রয়োজন অনুসারে আপনার অন্যান্য মডিউলগুলিতে ফাংশনগুলি কল করুন। ব্যবহার করুন যদি নাম __ == '__ প্রধান ' আপনার মডিউল উভয় আমদানিযোগ্য এবং এখনও ব্যবহারযোগ্য স্বতন্ত্র করতে কৌতুক।
blah238

আমার ড্যানের উদাহরণ আউটপুটটিতে কাজ করছে: সি: \ টেম্প \ মেইন_প্রগ্রাম.পি ('কিছু সংখ্যার যোগফল:', 55) ('স্কোয়ারের যোগফল:', 385) ('8 থেকে হ্যালো', [1, 2, 3 , 4, 5, 6, 7, 8, 9, 10]) তবে আমি উপরের মত একটি আর্কপাই উদাহরণের সাথে মানিয়ে নিতে সংগ্রাম করছি। আর্কপাই উদাহরণটি দেখতে কেমন হবে সে সম্পর্কে আরও কোনও সহায়তা প্রশংসিত হবে।
পলিজিও

আমি যুক্ত উত্তরটি দেখুন - আপনার উদাহরণের প্রসঙ্গে জিনিসগুলি আরও ভালভাবে ব্যাখ্যা করতে সহায়তা করা উচিত।
blah238

আমি সবেমাত্র জেসন পার্দির একটি দুর্দান্ত ব্লগ পোস্ট পেয়েছি যা ব্লগস.এসরি
ডেভি /

এই লিঙ্কটি তখন থেকে সরানো হয়েছে, এবং আমি বিশ্বাস করি এটি এখনই এখানে স্থিত রয়েছে
কার্কিস

উত্তর:


15

মূল স্ক্রিপ্টের মধ্যে একটি "ইউটিলিটি" মডিউল আমদানি করতে এবং স্ক্রিপ্ট সরঞ্জাম দ্বারা পঠিত পরামিতিগুলি ব্যবহার করে একটি ফাংশন কল করার জন্য এখানে আপনার পরীক্ষার উদাহরণটি দেওয়া হয়েছে:


কপিফাইটারসটুল.পি - স্ক্রিপ্ট সরঞ্জাম যা পরামিতিগুলিতে পড়ে এবং অন্য মডিউলে একটি ফাংশন কল করে

import CopyFeaturesUtility
import arcpy

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

কপিফাইটারস ইউটিলিটি.পি - একক ফাংশন রয়েছে এমন মডিউল 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

আপনাকে কেবল তা নিশ্চিত করতে হবে যে মূল মডিউল এবং শিশু মডিউল একই ফোল্ডারে রয়েছে in আপনি সহজেই শিশু মডিউলে প্যারামিটারগুলি সহজেই পাস করতে পারেন এবং যদি শিশু মডিউলে আরকি-তে অ্যাক্সেসের প্রয়োজন হয় (ধরে নিই যে আপনি আরক্যাপের 10 সংস্করণ ব্যবহার করছেন) এটির জন্য কেবল একটি রেফারেন্স দিন pass


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

যাইহোক, এটি পরীক্ষা-নিরীক্ষার স্ক্রিপ্টগুলিতে প্রয়োগ করার সময় জটিল হতে পারে যা অনেক বেশি দীর্ঘ হয় তাই আমি @ ব্লেজ 238 এর কাজটি ব্যবহার করেছি যা @ ড্যানপ্যাটারসনের পদ্ধতির সমর্থন করে এবং নীচের চূড়ান্ত (পরীক্ষা) কোড নিয়ে এসেছি যা আমার প্রয়োজন ঠিক তাই করে।

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