ইন্টারেক্টিভ করার সময় অজগরটিতে একটি মডিউল রিম্পোর্ট করুন


381

আমি জানি এটি করা যায়, তবে কীভাবে তা আমি কখনই মনে করি না।

আপনি কীভাবে অজগরটিতে একটি মডিউল পুনরায় বর্ধন করতে পারেন? পরিস্থিতিটি নিম্নরূপ: আমি ইন্টারেক্টিভভাবে একটি মডিউল আমদানি করি এবং এটি দিয়ে টিঙ্কার দিয়েছি, তবে তারপরে আমি একটি ত্রুটির মুখোমুখি। আমি .py ফাইলে ত্রুটিটি ঠিক করেছি এবং তারপরে পাইথন ছাড়াই স্থির মডিউলটি পুনরায় আমদানি করতে চাই। আমি এটা কিভাবে করবো ?



উত্তর:


367

এই কাজ করা উচিত:

reload(my.module)

থেকে পাইথন ডক্স

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

যদি পাইথন ৩.৪ এবং তার বেশি চালানো হয় import importlib, তবে করুন importlib.reload(nameOfModule)

এই পদ্ধতিটি ব্যবহার করার সাবধানতাগুলি ভুলে যাবেন না:

  • যখন কোনও মডিউল পুনরায় লোড করা হয়, এর অভিধানটি (মডিউলটির গ্লোবাল ভেরিয়েবলগুলি ধারণ করে) ধরে রাখা হয়। নামের পুনরায় সংজ্ঞাগুলি পুরানো সংজ্ঞাগুলিকে ওভাররাইড করবে, সুতরাং এটি সাধারণত কোনও সমস্যা নয়, তবে মডিউলটির নতুন সংস্করণ যদি পুরানো সংস্করণ দ্বারা সংজ্ঞায়িত কোনও নামটি সংজ্ঞায়িত না করে, তবে পুরানো সংজ্ঞাটি সরানো হয় না।

  • যদি কোনও মডিউল ব্যবহার করে অন্য মডিউল থেকে অবজেক্টগুলি আমদানি করে from ... import ..., অন্য মডিউলের reload()জন্য কল করা এটি থেকে আমদানিকৃত বিষয়গুলিকে নতুন করে সংজ্ঞায়িত না করে - এর চারপাশের এক উপায় হল fromবিবৃতিটি পুনরায় কার্যকর করা , অন্যটি হ'ল পরিবর্তিত importনাম এবং ব্যবহারযোগ্য নাম module.*name*

  • যদি কোনও মডিউল কোনও ক্লাসের দৃষ্টান্ত ইনস্ট্যান্ট করে, ক্লাসকে সংজ্ঞায়িত করে যে মডিউলটি পুনরায় লোড করা উদাহরণগুলির পদ্ধতির সংজ্ঞাগুলিকে প্রভাবিত করে না - তারা পুরানো শ্রেণীর সংজ্ঞাটি ব্যবহার করে চালিয়ে যান। উদ্ভূত শ্রেণীর ক্ষেত্রেও একই কথা।


26
যদি আমি আমার মডিউলগুলি ব্যবহার করে লোড করি from filename import *। কীভাবে পুনরায় লোড করবেন?
পিটার ঝু

"পিপলজু" থেকে "মোড ইম্পোর্ট এফসিএন" ক্ষেত্রে, মডিউল অবজেক্ট নাম জায়গাতে যুক্ত হয় না। সুতরাং আপনাকে স্পষ্টভাবে মডিউলটি আমদানি করতে হবে, যাতে আপনি পরে এটি পুনরায় লোড করতে পারেন। import foo; from foo import bar; reload(foo)
টেড

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

1
যদি আপনি নিম্নলিখিত হিসাবে "নাম হিসাবে আমদানি মোড" হিসাবে আপনার ফাংশনটি আমদানি করেন, তবে আপনাকে নিম্নলিখিত হিসাবে কাজটি করতে হবে: 'আমদানি আমদানি করুন Importlib.reload (নাম)'
নো

এই পদ্ধতিটি পুনরায় লোড করা মডিউলের অন্যান্য মডিউলগুলির রেফারেন্সগুলিকে ওভাররাইড করতে পারে না। এর সমাধানের জন্য stackoverflow.com/a/61617169/2642356 দেখুন ।
ইজলিয়ারার

287

অজগর 3 এ reloadআর কোনও বিল্ট ইন ফাংশন নেই।

আপনি যদি পাইথন ৩.৪+ ব্যবহার reloadকরেন তবে এর importlibপরিবর্তে আপনার লাইব্রেরি থেকে ব্যবহার করা উচিত :

import importlib
importlib.reload(some_module)

আপনি যদি পাইথন ৩.২ বা ৩.৩ ব্যবহার করেন তবে আপনার উচিত:

import imp  
imp.reload(module)  

পরিবর্তে. Http://docs.python.org/3.0/library/imp.html#imp.reload দেখুন

আপনি যদি ব্যবহার ipythonকরে থাকেন তবে অবশ্যই autoreloadএক্সটেনশনটি ব্যবহার করে বিবেচনা করুন :

%load_ext autoreload
%autoreload 2

যদিও পাইথন 2 তে প্রচুর পাইথন কোড লেখা হয় তবে পাইথন 3 প্রতিদিন একটি বিকল্পের পক্ষে আরও কার্যকর হয়ে উঠছে। ভকভগক!
অ্যারন জনসন

40
imp.reloadপাইথন ৩.৪ থেকে অবহেলিত, পরিবর্তে importlib.reloadফাংশন ব্যবহার করুন।
jfs

1
@ অ্যান্ড্রু ধন্যবাদ! আমি% অটোরলোড ব্যবহার করেছি, এটি দুর্দান্ত, আমার ইতিমধ্যে তৈরি বস্তুগুলি তাদের পুনরায় তৈরি না করে স্বয়ংক্রিয়ভাবে
শ্রেণিক

4
আমি একটু দেরি করে ফেলেছি, কিন্তু আমি এই কাজ যদি তুমি কি পুনরায় লোড করার প্রয়োজন একটি ফাংশান বা মডিউল মধ্যে থেকে ক্লাস হয় না মনে হয়: যদি আমার আমদানি statment ছিল from mymodule import myfunc, তারপর importlib.reload(myfunc), importlib.reload(mymodule.myfunc), importlib.reload(mymodule)সমস্ত একটি NameError দেব।
পাফ

@ পুফ কীভাবে কোনও ফাংশনটি পুনরায় আমদানি করতে নীচে আমার উত্তর দেখুন
jss367

46

আসলে, পাইথন 3-এ মডিউলটিকে impঅবনমিত হিসাবে চিহ্নিত করা হয়েছে। ভাল, কমপক্ষে এটি 3.4 এর জন্য সত্য।

পরিবর্তে মডিউল reloadথেকে ফাংশন importlibব্যবহার করা উচিত:

https://docs.python.org/3/library/importlib.html#importlib.reload

তবে সচেতন থাকুন যে এই লাইব্রেরিতে সর্বশেষ দুটি ছোট সংস্করণ সহ কিছু এপিআই-পরিবর্তন ছিল।


5

আপনি যদি কোনও মডিউল থেকে কোনও নির্দিষ্ট ফাংশন বা শ্রেণি আমদানি করতে চান তবে আপনি এটি করতে পারেন:

import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function

0

যদিও প্রদত্ত উত্তরগুলি একটি নির্দিষ্ট মডিউলটির জন্য কাজ করে তবে তারা সাবমোডিয়ুলগুলি পুনরায় লোড করবে না, এই উত্তরে উল্লেখ করা হয়েছে :

যদি কোনও মডিউল ব্যবহার করে অন্য মডিউল থেকে অবজেক্টগুলি আমদানি করে from ... import ..., অন্য মডিউলের reload()জন্য কল করা এটি থেকে আমদানিকৃত বস্তুগুলিকে নতুন করে সংজ্ঞায়িত না করে - এর চারপাশের এক উপায় হ'ল স্টেটমেন্ট থেকে পুনরায় সম্পাদন করা, অন্যটি হ'ল পরিবর্তিত importযোগ্য নাম ( module.*name*) ব্যবহার করা।

তবে, যদি __all__পাবলিক এপিআই সংজ্ঞায়িত করতে ভেরিয়েবল ব্যবহার করা হয় তবে সমস্ত প্রকাশ্যে উপলভ্য মডিউলগুলি স্বয়ংক্রিয়ভাবে পুনরায় লোড করা সম্ভব:

# Python >= 3.5
import importlib
import types


def walk_reload(module: types.ModuleType) -> None:
    if hasattr(module, "__all__"):
        for submodule_name in module.__all__:
            walk_reload(getattr(module, submodule_name))
    importlib.reload(module)


walk_reload(my_module)

পূর্বের উত্তরে উল্লিখিত গুহাতগুলি এখনও বৈধ। উল্লেখযোগ্যভাবে, __all__ভ্যারিয়েবল দ্বারা বর্ণিত হিসাবে একটি সাবমডিউল যা সর্বজনীন API এর অংশ নয় এটি পরিবর্তন করে এই ফাংশনটি ব্যবহার করে পুনরায় লোড দ্বারা প্রভাবিত হবে না। একইভাবে, সাবমডিউলের একটি উপাদান অপসারণ পুনরায় লোড দ্বারা প্রতিফলিত হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.