কোনও ত্রুটি বার্তা প্রদর্শিত না হয়ে আমি কীভাবে একটি আরকি স্ক্রিপ্টে sys.exit (0) ব্যবহার করতে পারি?


13

আমার কাছে আরকজিআইএস 10.0 এর জন্য একটি আরকি টুল স্ক্রিপ্ট রয়েছে যাতে দুটি প্রধান কার্যকরী বিভাগ রয়েছে। ব্যবহারকারী দ্বিতীয় বিভাগটি চালাবেন কিনা তা চয়ন করতে পারেন। যদি ব্যবহারকারী দ্বিতীয় বিভাগটি চালনা না করা চয়ন করে, আমি কেবল একটি ক্লিনআপ ফাংশন চালাতে চাই এবং সরঞ্জাম ফলাফলের উইন্ডোতে কোনও ত্রুটি বার্তা পোস্ট না করে একটি সিএস.এক্সিট (0) দিয়ে স্ক্রিপ্টটি প্রস্থান করতে চাই আরকিপি স্ক্রিপ্ট থেকে বেরিয়ে আসার বিষয়ে জিআইএস-এসইতে দুটি প্রধান থ্রেড রয়েছে তবে এর সমাধানগুলি ত্রুটি বার্তাকে বিশেষভাবে চিহ্নিত করে না। কোডের সাধারণ কাঠামোটি নিম্নরূপ:

import sys
##import arcpy

def CleanUp():
    print 'Cleaning up ...\n'

def finish():
    CleanUp()
    print 'Exiting ...'
    sys.exit(0)

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...\n'

if not do_more:
    finish()

#Section 2:  do more stuff
print 'doing more stuff ...'
CleanUp()

যদি আমি এই কোডটি আর্কজিআইএস / আরকিপির বাইরে পাইথন ইন্টারপ্রেটারে চালিত করি, এটি আমার প্রত্যাশার মতো কাজ করে, কোনও ত্রুটি বার্তা না করে নিখরচায় উপস্থিত হয়; তবে, এই একই কাঠামোযুক্ত আমার আরকি স্ক্রিপ্টে, স্ক্রিপ্টটি প্রস্থান করে, তবে সরঞ্জামের ফলাফল উইন্ডোতে একটি সিস্টেমএক্সিট ত্রুটি বার্তা পোস্ট করা হয়েছে। আরকি টুল সরঞ্জামের স্ক্রিপ্টটি ব্যতিক্রম খেতে এবং সিস্টেমএক্সিট ত্রুটি বার্তাটি কবর দেওয়ার কোনও উপায় আছে?


এখানে কেবল একটি বুনো ছুরিকাঘাত করা, তবে এটি কি সম্ভব যে আপনি আপনার স্ক্রিপ্টে সিস্টেমএক্সিট কল করার আগে "ডেল আরকিপি" করতে পারতেন?

@ ড্যান - আমি এটি সন্দেহ করি, তবে এটি একটি আকর্ষণীয় ধারণা ... হুমম ... হ্যাক কী। আমি এটিকে ঘূর্ণি দেব।
00 এ সেল্টিক্লাফ্লুট

1
সংক্ষিপ্ত কোড উদাহরণ পোস্ট করার জন্য আপনাকে ধন্যবাদ যা স্পষ্টত যুক্তিটি চিত্রিত করে এবং অতিরিক্তগুলি রেখে দেয়। +1
ম্যাট উইলকি

উত্তর:


8

সংক্ষিপ্ত উত্তর: 10.1 এ স্থির। আপাতত, আপনাকে অতিরিক্ত স্তরের ইন্ডেন্টেশন যুক্ত করতে হবে। এটি আপনার কোডটিতে কিছু কার্যকর রিফ্যাক্টরিংকে উত্সাহিত করতে পারে। আপনি যখনই কোনও একক স্ক্রিপ্ট / রুটিনে প্রচুর সংখ্যক লাইন পেয়েছেন, আপনি এটিকে যাইহোক ছোট ছোট বিভাগে (ফাংশন, ক্লাস) কাটা সম্পর্কে ভাবতে চাইবেন।

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass

ধন্যবাদ, জেসন হ্যাঁ, আমার গুলি ও চুল্লি কাটা উচিত। ক্লায়েন্টটি আমার ঘাড়ে নিঃশ্বাস নেওয়ার সাথে এটি করা খুব কঠিন। এটাই জীবন.
সেল্টিক্লু ফ্লুট

3

আরকিপি আপনার পাইথন পরিবেশের সাথে মিশে যায় । সংক্ষেপে, হয় sys.exit () করবেন না বা কল করুন আরকিপির "ক্লিনআপ-আগে-প্রস্থান" (যদি উপস্থিত থাকে) sys.exit () কল করার আগে ফাংশনটি পান না।


2
পাইথনের এক্সিকিউটেবল হ্যান্ডেল যেভাবে sys.exit()হ'ল এক ধরণের নোংরা কৌশল trick কলিং exitএকটি SystemExitব্যতিক্রম উত্থাপন করে এবং শীর্ষ স্তরের অনুবাদক, যা সাধারণত একটি ট্রেসব্যাক মুদ্রণ করে ব্যতিক্রমের ধরনটি সনাক্ত করে এবং দোভাষীকে সমাপ্ত করে দেয়। এক্সিকিউটেবলের আরকজিআইএস পরিবার হিসাবে অন্য অ্যাপ্লিকেশনটিতে পাইথন ইন্টারপ্রেটারকে এম্বেড করার জন্য বাস্তবায়ন-নির্দিষ্ট কোডের মতো একটি অযৌক্তিক পরিমাণ প্রয়োজন।
জেসন শায়িয়ার

2

আমি কীভাবে সিস্টেমএক্সিট ত্রুটি বার্তাকে 'কবর দিতে' জানি না, তবে আপনি সিএস.ইক্সিট কল এড়াতে সর্বদা আপনার কোডটি পুনর্গঠন করতে পারেন

import sys
##import arcpy

def DoMoreStuff():
    print 'doing more stuff ...'

def CleanUp():
    print 'Cleaning up ...'

def finish():
    CleanUp()
    print 'Exiting ...'

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...'

if do_more:DoMoreStuff()

finish()

সত্য, তবে আমার আরকি স্ক্রিপ্টের দুটি বিভাগ বরং বিশাল। আমি বরং আরও একটি স্তর ইন্ডেন্টেশন তৈরি করতে চাই না এবং এ জাতীয় সমস্যাগুলির সাথে মোকাবিলা করতে হবে যা হ'ল ... তবে, হ্যাঁ, এটি সমাধান হবে। সত্যিই হতাশার বিষয়টি হ'ল আপনি যখন আরকেপিতে sys.exit ব্যবহার করেন তখনই ত্রুটি বার্তা উপস্থিত হয়। নিয়মিত পাইথনে বার্তাটি পোস্ট করা হয় না, কারণ সিস্টেমএক্সিট ব্যতিক্রম ত্রুটি হিসাবে বিবেচিত হয় না।
সেল্টিক্লু ফ্লুট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.