আরকজিআইএস পাইথন টুলবক্সে আমদানি করা মডিউলগুলি রিফ্রেশ করছে?


15

আর্কম্যাপে পাইথন টুলবক্স (.pyt) ব্যবহার করার সময়, আমি সাধারণত একটি প্যাটার্ন অনুসরণ করব যেখানে ইনপুট আর্গুমেন্ট সংগ্রহ করতে এবং সরঞ্জামগুলি নিজেরাই সংজ্ঞায়িত করার জন্য .pyt ফাইলটি কেবল একটি মোড়ক। সমর্থনকারী কোড পৃথক ইউনিট-টেস্টেবল মডিউলগুলিতে রাখা হয়।

উদাহরণ:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

এটি সত্যিই ভাল কাজ করে তবে আমি বিকাশের সময় হতাশার একটি সমস্যার মধ্যে চলে এসেছি। ডান ক্লিক করুন -> আর্কম্যাপের .pyt উপর রিফ্রেশ করুন কেবলমাত্র .pt ফাইলের কোডটিকে রিফ্রেশ করে। এটি আমদানি করা মডিউলগুলি রিফ্রেশ করে না, তাই যখনই আমি সেখানে কিছু পরিবর্তন করি তখন আমাকে আরক্যাম্যাপটি বন্ধ ও পুনরায় খুলতে হবে। ভাগ্যক্রমে, যেহেতু আমি স্বাধীনভাবে কোডটি পরীক্ষা করে নিচ্ছি, আমাকে এক টন এটি করতে হবে না, তবে এটি এখনও একটি বড় ঝামেলা। এই কাছাকাছি কোন উপায় আছে? কিছুটা সম্পর্কিত - পাইথন কনসোলকে পুরোপুরি রিফ্রেশ করার কোনও উপায় আছে (আমার একটি কাস্টম সাইট-প্যাকেজ রয়েছে যা আমাকেও পরিবর্তনগুলি এড়াতে আর্কম্যাপটি বন্ধ / পুনরায় খুলতে হবে)?

আমি আর্কম্যাপ 10.2.1 ব্যবহার করছি।

উত্তর:


14

আমি এই সম্ভাবনাটি পেয়েছি, /programming/1517038/python-refresh-reload

একটি সতর্কতা হ'ল যদি আপনার কাছে মডিউলে কোনও ভেরিয়েবল বরাদ্দ থাকে তবে সেগুলি আবার নির্ধারিত করা দরকার।

তবে উপরে যেমন লেখা আছে, আপনি এটি করতে পারেন:

import supporting_module
def execute()
  reload(supporting_module)
  ...

এই উপায়টি প্রতিবার আপনি চালানোর সময় আপনি আপডেট হওয়া মডিউলটি নিশ্চিত হবেন। একবার উন্নয়ন হয়ে গেলে এটি বের করা যায়।


1
অত্যন্ত সহায়ক এবং এটি পোস্ট করা সহজ উদাহরণটি সমাধান করে। তবে, যদি সমর্থন_মডিউল অন্যান্য সহায়ক মডিউলগুলিও আমদানি করে তবে তাদের পুনরায় লোডের সাথেও কল করা দরকার। আমি ভাবছি যে পাইথন যেভাবে মডিউল বোঝাচ্ছে তার সাথে এটি বোধগম্য হওয়ায় এটিই আমরা সেরা হব - পরের দিন বা আরও কিছু দৃ rob়তর কিছু না এলে আমি আপনাকে উত্তর হিসাবে চিহ্নিত করব।
জোশ ওয়ার্টস

খুব উপকারী. আমি দেখতে পেয়েছি যে reload()সরঞ্জামবক্সের পিওয়াইটি ফাইলের শীর্ষে, সমর্থনকারী মডিউলটি আমদানির পরে ডানদিকে কল করা যথেষ্ট । সুতরাং, যদি টুলবক্সে বেশ কয়েকটি সরঞ্জাম থাকে তবে আমাকে প্রতিটি সরঞ্জামের execute()ফাংশনে পুনরায় লোডটি নকল করতে হবে না ।
মাইক ফিঞ্চ

আমি সত্যিই বুঝতে পারি না যে এই আনসার কীভাবে সমস্যার সমাধান করে। আমি আমার সরঞ্জামসমূহ .py ফাইল সঞ্চিত এবং আমি তাদেরকে ব্যবহার আমদানি from pyfile import Toolযোগ reload(tool)আয় typeError: reload() argument must be module। কোন ধারনা?
রত্নানিল

2
আমি সমাধান খুঁজে পেয়েছি! প্রথমে পাই-ফাইলকে মডিউল হিসাবে আমদানি করুন, পুনরায় লোড করুন এবং তারপরে মডিউলটির মধ্যে শ্রেণিটি আমদানি করুন। দেখুন: stackoverflow.com/a/6946467/4139249
Ratnanil

5

আমি আগে পরামর্শের চেয়ে এখানে একটি আলাদা এবং আরও দৃ way় উপায় is

আমি নিজেই এই মডিউলটি ব্যবহার করি নি, তবে আমি মনে করি এটি আপনার সমস্যার সমাধান করবে:

পাইথন মডিউল রিলোডার

এই পাঠাগারটি পাইথনের জন্য নির্ভরতা-ভিত্তিক মডিউল পুনরায় লোডার প্রয়োগ করে। অন্তর্নির্মিত পুনরায় লোড () ফাংশনের মতো নয়, এই পুনরায় লোডার অনুরোধ করা মডিউল এবং সেই সমস্ত মডিউল যে সেই মডিউলটির উপর নির্ভরশীল তা পুনরায় লোড করবে।

পূর্ববর্তী উদাহরণ দেওয়া, এটি একটি কল দিয়ে সমস্ত নির্ভরতা লোড করা উচিত:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

এই মডিউলটি আমি প্রথমবার লক্ষ্য করেছি, সুতরাং আপনি যদি এটি আপনার সরঞ্জামগুলিতে প্রয়োগ করেন তবে এটি আপনার পক্ষে কতটা কার্যকর তা নিয়ে মন্তব্য করুন।


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

1
সুপার, ফিরে রিপোর্ট করার জন্য ধন্যবাদ। হ্যাঁ, আর্কম্যাপ চালানোর সময় আমার মাঝে মাঝে ক্র্যাশ টেস্ট ডামির মতো মনে হয়।
cndnflyr

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