জ্যাঙ্গো শেলের মডিউলগুলি কীভাবে পুনরায় লোড করবেন?


90

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

আমি পুনরায় লোড () সম্পর্কে জানি, তবে আমি প্রচুর মডেল আমদানি করি এবং সাধারণত from app.models import *সিনট্যাক্স ব্যবহার করি , তাই পুনরায় লোড করা () খুব বেশি সহায়ক নয়।


4
"জ্যাঙ্গো-এক্সটেনশান" উত্তরটি সঠিক হিসাবে চিহ্নিত করতে আপনার এই প্রশ্নটি আপডেট করা উচিত।
কাঠার্ডজ

4
যতক্ষণ না এটি আসলে আমার পক্ষে কাজ করে। আমি এক্সটেনশানগুলি ইনস্টল করেছি এবং আমার কোড অটো-রিলোডগুলির একটিও নেই এবং আমি শেল_প্লাস ডক্সে অটো-লোড করার কোনও উল্লেখ দেখতে পাই না। দেখে মনে হচ্ছে রানসরভার_প্লাস কমান্ডে একটি রিলোডার রয়েছে, তবে এটি আমি খুঁজছি না।
ম্যাড ওম্বাট 21

উত্তর:


37

আমি ডাঙ্গোইমিংয়ের মাধ্যমে উপরে বর্ণিত জ্যাঙ্গো-এক্সটেনশন প্রকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি। তবে কেবল 'শেল_প্লাস' পরিচালনা কমান্ডের পরিবর্তে, ব্যবহার করুন:

manage.py shell_plus --notebook

এটি আপনার ওয়েব ব্রাউজারে একটি আইপিথন নোটবুক খুলবে। সেখানে আপনার ঘরে একটি কোড, আপনার আমদানি ইত্যাদি লিখুন এবং এটি চালান।

আপনি যখন আপনার মডিউলগুলি পরিবর্তন করবেন, কেবলমাত্র নোটবুক মেনু আইটেম 'কার্নেল-> পুনরায় চালু করুন "ক্লিক করুন

আপনি সেখানে যান, আপনার কোড এখন আপনার সংশোধিত মডিউলগুলি ব্যবহার করছে।


30
"কেবল একটি পাইথন নোটবুক ব্যবহার করুন" ওপি-র প্রশ্নের উত্তর নয়।
জে

এই পদ্ধতিটি% অটোরলোডের মতো স্বয়ংক্রিয় না হয়েও অটোরেলোডের চেয়ে নির্ভরযোগ্যভাবে কাজ করে। কার্নেল পুনঃসূচনা গ্যারান্টি দেয় যে নোটবুকের সমস্ত কক্ষ সম্পূর্ণরূপে পুনরায় লোড করা মডিউল পেয়েছে। প্লাস আপনি পুনরায় আরম্ভ করতে পারেন এবং আপনি যদি চয়ন করেন সমস্ত কক্ষ চালাতে পারেন।
আন্তোন আই সিপোস

72

আমি আইপিথন অটোরলোড এক্সটেনশন ব্যবহার করার পরামর্শ দেব ।

./manage.py shell

In [1]: %load_ext autoreload
In [2]: %autoreload 2

এবং এখন থেকে সমস্ত আমদানি করা মডিউলগুলি মূল্যায়নের আগে সতেজ করা হবে।

In [3]: from x import print_something
In [4]: print_something()
Out[4]: 'Something'

 # Do changes in print_something method in x.py file.

In [5]: print_something()
Out[5]: 'Something else'

%load_ext autoreloadকমান্ডের আগে কিছু আমদানি করা থাকলেও কাজ করে ।

./manage.py shell
In [1]: from x import print_something
In [2]: print_something()
Out[2]: 'Something'

 # Do changes in print_something method in x.py file.

In [3]: %load_ext autoreload
In [4]: %autoreload 2
In [5]: print_something()
Out[5]: 'Something else'

%aimportকমান্ড এবং 3 অটোরলোড কৌশলগুলি দিয়ে কিছু আমদানি রিফ্রেশ করা থেকেও রোধ করা সম্ভব :

% অটোরলোড

  • এখনই স্বয়ংক্রিয়ভাবে সমস্ত মডিউল (% এম্পোর্ট দ্বারা বাদ দেওয়াগুলি ব্যতীত) পুনরায় লোড করুন।

% অটোরলোড 0

  • স্বয়ংক্রিয় পুনরায় লোডিং অক্ষম করুন।

% অটোরলোড 1

  • টাইপযুক্ত পাইথন কোডটি কার্যকর করার আগে প্রতিবার% এম্পোর্টের সাথে আমদানি করা সমস্ত মডিউল পুনরায় লোড করুন।

% অটোরলোড 2

  • পাইথন কোড টাইপ করা কার্যকর করার আগে প্রতিবার সমস্ত মডিউল পুনরায় লোড করুন (% অ্যাম্পোর্ট বাদে বাদে) time

% এম্পোর্ট

  • স্বয়ংক্রিয়ভাবে আমদানি করা হবে বা আমদানি করা হবে না এমন তালিকা মডিউলগুলি।

% এম্পোর্ট foo

  • 'Foo' মডিউল আমদানি করুন এবং এটি% অটোরলোড 1 এর জন্য স্বয়ংক্রিয় লোড হওয়ার জন্য চিহ্নিত করুন

% এম্পোর্ট -ফু

  • স্বয়ংক্রিয় লোড না হওয়ার জন্য মডিউল 'foo' চিহ্নিত করুন।

এটি সাধারণত আমার ব্যবহারের পক্ষে ভাল কাজ করে তবে কয়েকটি ক্যাভেটাস রয়েছে:

  • কোড অবজেক্টগুলি প্রতিস্থাপন সবসময় সফল হয় না: একটি ক্লাসে @ প্রপার্টি একটি সাধারণ পদ্ধতিতে বা সদস্যের ভেরিয়েবলের কোনও পদ্ধতিতে পরিবর্তন করা সমস্যার কারণ হতে পারে (তবে কেবল পুরানো অবজেক্টগুলিতে)।
  • মডিউলটি পুনরায় লোড হওয়ার আগে মুছে ফেলা (যেমনঃ বানর-প্যাচিংয়ের মাধ্যমে) সরিয়ে ফেলা ফাংশনগুলি আপগ্রেড করা হয় না।
  • সি এক্সটেনশন মডিউলগুলি পুনরায় লোড করা যায় না এবং তাই স্বয়ংক্রিয় লোড করা যায় না।

4
আপনি যদি জাঙ্গোর ব্যবহার করছেন /manage.py shell_plus... আপনি যদি টাইপ করেন %load_ext autoreloadএবং তারপরে %autoreload 2, মডেলগুলি স্বয়ংক্রিয়ভাবে পুনরায় লোড হবে।
ফিউশন

আশ্চর্যজনক, আপনি আমার দিনটি তৈরি করেছেন
শামসুল আরেফিন সজিব

মনে রাখবেন যে আপনার অবশ্যই এটির জন্য আইপিথন ইনস্টল করা দরকার। যেমন দেখুন stackoverflow.com/a/47170195/50899
Rabarberski

38

django- এক্সটেনশন প্রকল্পের দ্বারা সরবরাহ করা পরিচালন.পি শেল_প্লাস কমান্ডটি দেখুন । এটি শেল প্রারম্ভকালে আপনার সমস্ত মডেল ফাইল লোড করবে। এবং আপনার কোনও পরিবর্তনকে অটোরেলোড করুন তবে প্রস্থানের দরকার নেই, আপনি সেখানে সরাসরি কল করতে পারেন


40
আমি শেল_প্লাস ব্যবহার করি এবং আমার মডেলগুলি স্বয়ংক্রিয়-পুনরায় লোড হচ্ছে না, আমি কি কিছু হারিয়েছি?
দিয়েগো পনসিয়ানো

30
শেল_প্লাস মডেলগুলি পুনরায় লোড করে না, সুতরাং এটি প্রশ্নের উত্তর দেয় না।
আলজাবায়ার

4
যেমনটি বলা হয়েছে, শেল_প্লাস মডেলগুলি পুনরায় লোড করে না।
জেনপার্টু

4
হয়তো আমি কিছু মিস করছি, তবে শেল_প্লাস আমার জন্য কিছুই পুনরায় লোড করে না। এটি প্রারম্ভকালে সমস্ত মডেল লোড করে, যা সুবিধাজনক তবে এটি is
ম্যাড ওম্বাট

14
শেল_প্লাস অটোরেলোড মডিউলটি ব্যবহার করে মডিউলগুলি পুনরায় লোড করতে পারে। '% লোড_সেক্সট অটোরলোড' টাইপ করুন এবং তারপরে '% অটোরলোড 2' - আইপিথন.আর.
পাইপথন-

37

আমার সমাধানটি হ'ল আমি কোডটি লিখি এবং একটি ফাইলে সংরক্ষণ করি এবং তারপরে ব্যবহার করুন:

পাইথন ম্যানেজ.পি শেল <টেস্ট.পি

সুতরাং আমি পরিবর্তন করতে পারি, সংরক্ষণ করতে পারি এবং আবারও সেই আদেশটি চালাতে পারি যতক্ষণ না আমি ঠিক করার চেষ্টা করছি যা ঠিক না করে।


4
সুন্দর এবং সহজ। একটি নোট, exit()ক্লিনার ফ্যাশনে জ্যাঙ্গো শেল থেকে বেরিয়ে যাওয়ার জন্য পাই ফাইলের নীচে যুক্ত করুন । ধন্যবাদ.
মার্চ

সহজ এবং মার্জিত সমাধান। সাবাশ.
নিকোস্কিপ

25

দেখে মনে হচ্ছে যে এই বিষয়ে সাধারণ sensকমত্য, পাইথন রিলোড () সফল হয় এবং এটি করার কোনও ভাল উপায় নেই।


ত্রুটিপূর্ণ. @ উপরোক্ত ডংওইমিংয়ের উত্তরটি হল সমাধান, এবং সেরা উত্তর হিসাবে গ্রহণ করা উচিত।
জোসেফ শেডি

4
তার উত্তরে একাধিক মন্তব্য বলে যে শেল_প্লাস মডেলগুলি পুনরায় লোড করে না
ম্যাড

4
আমি নিজেই এটি পরীক্ষা করেছি এবং এটি পুনরায় লোড হয় না। এছাড়াও, আমি হাতে হাতে আমদানি করা নন-মডেল কোড সম্পর্কে কী করব?
ম্যাড ওম্বাট 21

আমি যে অ্যাপ্লিকেশন ব্যবহার করছি তার ক্লাসগুলি এখন প্লেইন নন-জাঙ্গো-মডেল মডিউল এবং এর মধ্যে থাকা ক্লাস সহ দুর্দান্ত (পাইথন ৩.৪.৩, জ্যাঙ্গো ১.৯ বি 1, জাঙ্গো-এক্সটেনশনগুলি 1.5.9) পুনরায় লোড করুন। এই উত্তরটির 5 বছর হয়ে গেছে এবং প্রচুর বিকাশ ঘটেছে।
জোসেফ শেডি 21

4
আমি 40 মিনিট আগে আমার সেটআপটিতে এটি ব্যবহার করে দেখেছি এবং শেল_প্লাস আমার জন্য কিছুই পুনরায় লোড করে না। জ্যাঙ্গো 1.7.10, পাইথন 3.4.3, জ্যাঙ্গো-এক্সটেনশনগুলি 1.5.9।
ম্যাড ওম্বাট

5

পুনরায় লোড () কিছু কৌশল ছাড়া জাজানো শেলটিতে কাজ করে না। আপনি এই থ্রেড না এবং আমার উত্তরটি বিশেষভাবে পরীক্ষা করতে পারেন:

"ম্যানেজ.পি শেল" এর মাধ্যমে ইন্টারেক্টিভ ইন্টারপ্রেটার ব্যবহার করে আপনি কীভাবে জ্যাঙ্গো মডেল মডিউলটি পুনরায় লোড করবেন?


5

এই অসুবিধার জন্য আমার সমাধান অনুসরণ করে। আমি আইপিথন ব্যবহার করছি।

$ ./manage.py shell
> import myapp.models as mdls   # 'mdls' or whatever you want, but short...
> mdls.SomeModel.objects.get(pk=100)
> # At this point save some changes in the model
> reload(mdls)
> mdls.SomeModel.objects.get(pk=100)

পাইথন ৩.x এর জন্য অবশ্যই 'পুনরায় লোড' ব্যবহার করে আমদানি করতে হবে:

from importlib import reload

আশা করি এটা সাহায্য করবে. অবশ্যই এটি ডিবাগের উদ্দেশ্যে।

চিয়ার্স


2

আইপিথন কনফিগারেশনের সাহায্যে শেল_প্লাস ব্যবহার করুন । autoreloadশেল_প্লাস স্বয়ংক্রিয়ভাবে কিছু আমদানি করার আগে এটি সক্ষম করবে ।

pip install django-extensions
pip install ipython
ipython profile create

আপনার আইপিথন প্রোফাইল সম্পাদনা করুন ( ~/.ipython/profile_default/ipython_config.py):

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

একটি শেল খুলুন - মনে রাখবেন যে আপনাকে অন্তর্ভুক্ত করার দরকার নেই --ipython:

python manage.py shell_plus

এখন কিছু সংজ্ঞায়িত SHELL_PLUS_PRE_IMPORTSবা SHELL_PLUS_POST_IMPORTS( ডক্স ) autoreload হবে!

মনে রাখবেন যে আপনার pdb.set_trace()ফাইলটি সংরক্ষণ করার সময় যদি আপনার শেল কোনও ডিবাগার (প্রাক্তন ) এ থাকে তবে এটি পুনরায় লোডের সাথে হস্তক্ষেপ করতে পারে।


4
উত্তরের জন্য ধন্যবাদ. যদিও আপনি লক্ষ করতে পারেন, আমি 2010 সালে এটি জিজ্ঞাসা করেছি। আমি জেনে খুশি হয়েছি যে আট বছর পরে অটো-রিলোড অবশেষে শেল_প্লাসে কাজ করে :)
ম্যাড


0

আপনি যা চান ঠিক তা নয়, তবে আমি এখন নিজেকে পরীক্ষার জন্য জিনিসগুলিতে মজাদার ব্যবস্থাপনার আদেশগুলি তৈরি করতে চাই।

কমান্ডটিতে আপনি স্থানীয়দের একগুচ্ছ সেট আপ করতে পারেন এবং আপনার পরবর্তীতে একটি ইন্টারেক্টিভ শেলের মধ্যে ফেলে দিতে পারেন।

import code

class Command(BaseCommand):
  def handle(self, *args, **kwargs):
     foo = 'bar'
     code.interact(local=locals())

পুনরায় লোড নয়, তবে আন্তঃসংযোগজনকভাবে জাঙ্গো কার্যকারিতা পরীক্ষা করার একটি সহজ এবং কম বিরক্তিকর উপায়।

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