আইপিথনে সাবমডিউলগুলি পুনরায় লোড করা হচ্ছে


363

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

আইপিথনে ফ্রেমওয়ার্কটি একটি সাধারণ importকমান্ড দ্বারা লোড হয় । তবে প্রায়শই কাঠামোর একটি সাবমডিউলে কোড পরিবর্তন করা প্রয়োজন। এই মুহুর্তে একটি মডেল ইতিমধ্যে লোড হয়েছে এবং আমি এটির সাথে ইন্টারঅ্যাক্ট করতে আইপিথন ব্যবহার করি।

এখন, ফ্রেমওয়ার্কটিতে অনেকগুলি মডিউল রয়েছে যা একে অপরের উপর নির্ভর করে, অর্থাৎ যখন ফ্রেমওয়ার্কটি প্রাথমিকভাবে লোড করা হয় তখন মডিউলটি সাবমোডিয়ালগুলি আমদানি ও কনফিগার করে। কোডটিতে পরিবর্তনগুলি কেবল তখনই কার্যকর করা হয় যদি মডিউলটি ব্যবহার করে পুনরায় লোড করা হয় reload(main_mod.sub_mod)। পুরোপুরি ব্যবহার করে পৃথকভাবে সমস্ত পরিবর্তিত মডিউলগুলি পুনরায় লোড করা দরকার বলে এটি জটিল is এটি খুব সুবিধাজনক হবে যদি reload(main_module)সমস্ত সাব মডিউলগুলি পুনরায় লোড করে তবে নাম্পি / স্কিপি পুনরায় লোড না করে ..


আপনি আরও বিস্তারিত জানাতে যত্ন নিতে However, it is often necessary to change code in one of the submodules of the framework.তাই কেন এটি necessary to change code? ধন্যবাদ
খাবেন

16
@ বিট: ফ্রেমওয়ার্কটি ক্রমাগত বিকাশমান হয়, তাই কোড বেসে নিয়মিত পরিবর্তন হয় are
আলাইন

উত্তর:


531

আইপিথন কিছু স্বয়ংক্রিয় পুনরায় লোড করার যাদু নিয়ে আসে :

%load_ext autoreload
%autoreload 2

এটি নতুন লাইন কার্যকর করার আগে প্রতিবার পরিবর্তিত সমস্ত মডিউল পুনরায় লোড করবে। যেভাবে এই কাজ করে তার চেয়ে কিছুটা আলাদা dreload। কিছু সাবধানতা প্রয়োগ করে, %autoreload?কী ভুল হতে পারে তা দেখতে টাইপ করুন ।


আপনি যদি সর্বদা এই সেটিংস সক্ষম করতে চান তবে আপনার আইপিথন কনফিগারেশন ফাইলটি ~/.ipython/profile_default/ipython_config.py[1] এবং সংযোজন:

c.InteractiveShellApp.extensions = ['autoreload']     
c.InteractiveShellApp.exec_lines = ['%autoreload 2']

নীচের একটি মন্তব্যের মাধ্যমে @ কোসকে ক্রেডিট করুন।

[1] আপনার কাছে ফাইল না থাকলে ~/.ipython/profile_default/ipython_config.pyআপনার ipython profile createপ্রথমে কল করা দরকার । অথবা ফাইলটি অবস্থিত হতে পারে $IPYTHONDIR


63
আমি c.InteractiveShellApp.extensions = ['autoreload']এবং c.InteractiveShellApp.exec_lines = ['%autoreload 2']আমার মধ্যে ~/.ipython/profile_default/ipython_config.py
কোস

4
এটি একটি পারফরম্যান্স হিট হতে পারে, তবে, সতর্কতার সাথে ব্যবহার করুন।
asmeurer

3
পুনরায় লোডটি কেবল তখন সম্পাদিত হয় যখন আপনি আইপথন শেলটিতে এন্টার চাপুন এবং সাধারণত লক্ষ্যণীয় হয় না।
পিভি।

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

3
আপনি যদি @ কোস পদ্ধতি ব্যবহার করেন তবে সি নিশ্চিত হয়ে গেছে তা নিশ্চিত করুন: c = get_config ()
টিকন

27

আইপিথন 0.12 (এবং সম্ভবত পূর্বে) এ আপনি এটি ব্যবহার করতে পারেন:

%load_ext autoreload
%autoreload 2

এটি মূলত পিভি দ্বারা উত্তর হিসাবে একই কেবলমাত্র, এক্সটেনশনটির নাম পরিবর্তন করা হয়েছে এবং এখন ব্যবহার করে লোড করা হয়েছে %load_ext


20

কোনও কারণে, আপনি যখন একটি নোটবুক থেকে অন্য নোটবুকটিতে কোড আমদানি করেন তখন %autoreloadবা dreloadউভয়ই সেই পরিস্থিতিতে কাজ করে না বলে মনে হয় । পাইথন কেবলমাত্র কাজ করে:reload

reload(module)

[1] ভিত্তিক ।


10
পাইথন ৩.৪++ এ আপনি ইমপোর্টলিব মডিউলে পুনরায় লোড পেতে পারেন। এই প্রশ্নটি দেখুন ।
প্রবীণ

1
এই পদ্ধতিটি %autoreloadকৌশলটির বিপরীতে একটি উদাহরণ পদ্ধতি যুক্ত করার সময় কাজ করে । এর জন্য সমর্থন যুক্ত করার %autoreloadজন্য একটি ওপেন বাগ রিপোর্ট রয়েছে
আইজোসেফ

18

আইপিথন dreload()সমস্ত সাবমডিউলগুলি পুনরাবৃত্তভাবে পুনরায় লোড করার প্রস্তাব দেয়। ব্যক্তিগতভাবে, আমি %run()যাদু কমান্ডটি ব্যবহার করতে পছন্দ করি (যদিও এটি মন্তব্যগুলিতে জন সালভাটিয়ার দ্বারা নির্দেশিত হিসাবে একটি গভীর পুনরায় লোড সঞ্চালন করে না)।


11
আমি মনে করি (দুর্ভাগ্যক্রমে)% চালিত স্ক্রিপ্ট.পি কেবল যে স্ক্রিপ্টটি কল করছেন এটি পুনরায় লোড করে, প্যাকেজগুলি এটি আমদানি করে না। আপনি যদি তৈরি করছেন এমন প্যাকেজটি ডিবাগ করার চেষ্টা করছেন, এটি ব্যথা হতে পারে।
জন সালভাটিয়ার

2
বিশেষ দ্রষ্টব্য। ডিপ্রেডলোডেরdreload মাধ্যমে সাম্প্রতিক আইপিথন (যেমন আইপিথন 6.0) প্রতিস্থাপন করা হয়েছে ।
ডান ম্যাকিনলে

8

মডিউল নামে importlibপরিচিতি অভ্যন্তরীণ আমদানিতে অ্যাক্সেসের অনুমতি দেয়। বিশেষত, এটি ফাংশন সরবরাহ করে importlib.reload():

import importlib
importlib.reload(my_module)

বিপরীতে %autoreload, importlib.reload()মডিউলে সেট করা গ্লোবাল ভেরিয়েবলগুলি পুনরায় সেট করুন। বেশিরভাগ ক্ষেত্রে, আপনি যা চান তা এটি।

importlibপাইথন ৩.১ থেকে কেবল উপলব্ধ। পুরানো সংস্করণের জন্য, আপনাকে মডিউল ব্যবহার করতে হবে imp


আমার পক্ষে কাজ করা একমাত্র সমাধান
gustavz

5

http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/

সেই ম্যাজিক ফাংশনটি বারবার টাইপ করা এড়াতে, তাদের আইপথন স্টার্টআপ স্ক্রিপ্টে রাখা যেতে পারে (.Python / profile_default / startup এর অধীনে .py প্রত্যয় দিয়ে এর নাম দিন that ফোল্ডারের অধীনে সমস্ত পাইথন স্ক্রিপ্টগুলি লেক্সিকাল ক্রম অনুযায়ী লোড করা হবে) যা নিম্নলিখিত মত দেখাচ্ছে:

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")

আপনি যদি চিত্রনাট্যটি %run script.pyআইপিথন আরপিএল দিয়ে উদাহরণ সহ চালাচ্ছেন তবে এটি কাজ করে বলে মনে হচ্ছে
প্যাট্রিক সানান

3

এটি সম্পর্কে:

import inspect

# needs to be primed with an empty set for loaded
def recursively_reload_all_submodules(module, loaded=None):
    for name in dir(module):
        member = getattr(module, name)
        if inspect.ismodule(member) and member not in loaded:
            recursively_reload_all_submodules(member, loaded)
    loaded.add(module)
    reload(module)

import mymodule
recursively_reload_all_submodules(mymodule, set())

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


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

এটি আসলে কভার করে না from ... import ...এবং import ... asযতক্ষণ আপনি আমদানি করেন তা মডিউল। এটি কেবল আবশ্যক নয় এমন কোনও প্যাকেজের মডিউল যা এটি __init__.pyফাইল থেকে লোড করা হয়নি । প্যাকেজগুলির জন্য, আপনি সম্ভবত মডিউলটির __path__বৈশিষ্ট্যটি ডিরেক্টরি কিনা তা পরীক্ষা করতে পারেন । যদি তা হয় তবে এটিকে অতিক্রম করুন এবং পুনরায় ক্রমহীন সমস্ত মডিউল আপনি খুঁজে পেতে পারেন তা আমদানি করুন। আমি এই অংশটি লিখিনি কারণ লেখক প্যাকেজগুলির জন্য কোনও সমাধান চান নি।
YH Wong

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

pkgutilপ্যাকেজটি শীর্ষ মডিউলটিতে সাবমোডিয়ালগুলি আমদানি না করেও আপনি প্যাকেজে সমস্ত সাবমোডিয়াল পেতে ব্যবহার করতে পারেন । stackoverflow.com/a/1707786/1243926
osa

sys.modules:
আপনাকেও

2

অন্য বিকল্প:

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF

উবুন্টু 14.04-এ আইপিথন এবং আইপিথন 3 ভি 5.1.0 এ যাচাই করা হয়েছে।


1

পুনরায় লোড করার জন্য আমার স্ট্যান্ডার্ড অনুশীলনটি প্রথম প্রথম খোলার পরে উভয় পদ্ধতি একত্রিত করা হয় IPython:

from IPython.lib.deepreload import reload
%load_ext autoreload
%autoreload 2

এটি করার আগে মডিউলগুলি লোড করা ম্যানুয়াল সহ এমনকি তাদের পুনরায় লোড করা না ঘটায় reload(module_name)। আমি এখনও, খুব কমই, ক্লাসের পদ্ধতিগুলি পুনরায় লোড না করায় অবর্ণনীয় সমস্যাগুলি পাই যা আমি এখনও সন্ধান করি নি।


1

মনে রাখবেন যে উল্লিখিত autoreloadফাইলগুলি কেবলমাত্র ইন্টেলিজে কাজ করে যদি আপনি ম্যানুয়ালি পরিবর্তিত ফাইলটি সংরক্ষণ করেন (যেমন, ctrl + s বা cmd + s ব্যবহার করে)। এটি অটো-সেভিংয়ের সাথে কাজ করছে বলে মনে হচ্ছে না।


আমি নিশ্চিত করি এটি পাইকার্মের ক্ষেত্রেও।
tsando

0

অ্যানাকোন্ডায় জুপিটার নোটবুকগুলিতে, এটি করছেন:

%load_ext autoreload
%autoreload 2

বার্তা উত্পাদন:

স্বয়ংক্রিয় লোড এক্সটেনশন ইতিমধ্যে লোড হয়েছে। এটি পুনরায় লোড করতে, ব্যবহার করুন: %reload_ext autoreload

দেখে মনে হচ্ছে এটি করা ভাল:

%reload_ext autoreload
%autoreload 2

সংস্করণ সংক্রান্ত তথ্য:

নোটবুক সার্ভারের সংস্করণ 5.0.0 এবং এটি চলছে: পাইথন 3.6.2 | অ্যানাকোন্ডা, ইনক। | (ডিফল্ট, সেপ্টেম্বর 20 2017, 13:35:58) [এমএসসি v.1900 32 বিট (ইন্টেল)]


0

কোনও সাবওবজেক্টগুলি এর দ্বারা পুনরায় লোড হবে না, আমি বিশ্বাস করি এর জন্য আপনাকে আইপিথনের ডিপ্রেইলড ব্যবহার করতে হবে।

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