আমি যখন আমদানি করি তখন পাইথন কেন আমার মডিউলটি চালাচ্ছে এবং আমি কীভাবে এটি বন্ধ করব?


173

আমার একটি পাইথন প্রোগ্রাম আমি তৈরি করছি যা 2 টির মাধ্যমে চালানো যেতে পারে: প্রথমটি হল "পাইথন মেইন.পি" কল করা যা ব্যবহারকারীকে বন্ধুত্বপূর্ণ উপায়ে ইনপুট দেওয়ার জন্য অনুরোধ করে এবং তারপরে প্রোগ্রামটির মাধ্যমে ব্যবহারকারী ইনপুট চালায়। অন্য উপায়টি হ'ল "পাইথন ব্যাচ.পি- ফাইল - " যা সমস্ত বন্ধুত্বপূর্ণ ইনপুট সংগ্রহের মধ্য দিয়ে চলে যাবে এবং একসাথে প্রোগ্রামের মাধ্যমে একটি সম্পূর্ণ ফাইলের ইনপুটটির সঞ্চার করবে।

সমস্যাটি হ'ল আমি "batch.py" চালানোর সময় এটি "মেইন.পি" থেকে কিছু পরিবর্তনশীল / পদ্ধতি / ইত্যাদি আমদানি করে এবং যখন এই কোডটি চালায়:

import main

প্রোগ্রামের প্রথম লাইনে এটি তাত্ক্ষণিকভাবে ত্রুটিগুলি কারণ এটি "মেইন.পাই" তে কোড চালানোর চেষ্টা করে।

আমি আমদানি করছি এমন "মূল" মডিউলটিতে থাকা কোডটি চালানো থেকে পাইথনকে কীভাবে থামাতে পারি?

উত্তর:


251

কারণ পাইথন এটি ঠিক কীভাবে কাজ করে - যেমন কীওয়ার্ডগুলি classএবং defকোনও ঘোষণা নেই । পরিবর্তে, তারা বাস্তব লাইভ স্টেটমেন্ট যা সম্পাদিত হয়। যদি এগুলি কার্যকর না করা হয় তবে আপনার মডিউলটি খালি হবে :-)

যাইহোক, মূio় পন্থাটি হল:

# stuff to run always here such as class/def
def main():
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

দেখুন কি if __name__ == "__main__"জন্য?

এটির জন্য মডিউলটি সম্পাদনা করার উপর উত্স নিয়ন্ত্রণের প্রয়োজন নেই import

শুভ কোডিং।


1
কেবলমাত্র নিশ্চিত করার জন্য, আপনার মন্তব্য "চালানোর জন্য স্টাফ কেবল 'আমদানি'-এর মাধ্যমে এখানে কল করা না হলে" প্রধান () এর অধীনে লিখিত আদেশগুলি বোঝায়, তাই না? নাকি তাতে কিছু যায় আসে না ??
স্বর্ণের নাম

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

51

পাইথন যেভাবে কাজ করে তার কারণে এটি আপনার মডিউলগুলি আমদানি করার সময় চালানো দরকার।

আমদানির সময় মডিউলটিতে কোডটি কার্যকর করা থেকে রোধ করতে, তবে কেবল যখন সরাসরি চালানো হয়, আপনি এটির সাহায্যে এটি রক্ষা করতে পারেন if:

if __name__ == "__main__":
    # this won't be run when imported

আপনি এই কোডটি কোনও main()পদ্ধতিতে রাখতে চান , যাতে আপনি সরাসরি ফাইলটি কার্যকর করতে পারেন, বা মডিউলটি আমদানি করতে এবং কল করতে পারেন main()। উদাহরণস্বরূপ, ধরুন এটি ফাইলটিতে রয়েছে foo.py

def main():
    print "Hello World"

if __name__ == "__main__":
    main()

এই প্রোগ্রামটি হয় python foo.pyবা অন্য পাইথন স্ক্রিপ্ট থেকে চালানো যেতে পারে :

import foo

...

foo.main()

12

if __name__ == '__main__'আইডিয়ামটি ব্যবহার করুন - __name__একটি বিশেষ পরিবর্তনশীল যাটির মান হ'ল '__main__'যদি মডিউলটি কোনও স্ক্রিপ্ট হিসাবে চালানো হয় এবং মডিউলটির নাম যদি এটি আমদানি করা হয়। আপনি যেমন কিছু করতে চাই

# imports
# class/function definitions
if __name__ == '__main__':
    # code here will only run when you invoke 'python main.py'

4

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

যেহেতু সম্ভবত আপনার ফাইলটিতে অ্যাক্সেস রয়েছে, তবে আপনি সম্ভবত ত্রুটি কারণটির কারণটি দেখতে ও দেখতে সক্ষম হতে পারেন। ত্রুটি যাতে না ঘটে সেজন্য আপনার পরিবেশটি পরিবর্তন করা সম্ভব।


1
একটি দ্রষ্টব্য হিসাবে: যদি পরিবেশটি পরিবর্তন করার কোনও উপায় না থাকে যাতে ত্রুটি রোধ করা যায়, সম্ভবত আপনার একটি আলাদা মডিউল ব্যবহার করা উচিত
cwallenpoole

4

কোডটি কোনও ফাংশনের ভিতরে রাখুন এবং আপনি ফাংশনটি কল না করা পর্যন্ত এটি চলবে না। আপনার একটি প্রধান ফাংশন থাকা উচিত main.py। বিবৃতি সহ:

if __name__ == '__main__':
  main()

তারপরে, আপনি কল python main.pyকরলে main()ফাংশনটি চলবে। আপনি যদি আমদানি করেন তবে main.pyতা হবে না। এছাড়াও, main.pyস্পষ্টতার জন্য আপনার সম্ভবত অন্য কোনও নামকরণ করা উচিত ।


3

একটি পাইথন বর্ধিতকরণ প্রস্তাব ছিল PEP 299 যা প্রতিস্থাপন লক্ষ্যে if __name__ == '__main__':সঙ্গে বাগ্ধারা def __main__:, কিন্তু এটা বাতিল করা হয়েছে। এটি ব্যবহার করার সময় কী মনে রাখা উচিত তা এখনও জানতে পারা ভাল if __name__ = '__main__':


2

আপনি আপনার "মেইন.পি" লিখতে পারেন:

#!/usr/bin/env python

__all__=["somevar", "do_something"]

somevar=""

def do_something():
    pass #blahblah

if __name__=="__main__":
    do_something()

-1

যদিও আপনি importকোডটি না চালিয়ে ব্যবহার করতে পারবেন না ; বেশ দ্রুত গতির উপায় রয়েছে যাতে আপনি আপনার ভেরিয়েবলগুলি ইনপুট করতে পারেন; ব্যবহার করে numpy.savez, যা একটি .npz ফাইলে ন্যালি অ্যারে হিসাবে ভেরিয়েবল সঞ্চয় করে । এরপরে আপনি ভেরিয়েবলগুলি ব্যবহার করে লোড করতে পারেন numpy.load

স্কিপি ডকুমেন্টেশনে একটি সম্পূর্ণ বিবরণ দেখুন

দয়া করে মনে রাখবেন এটি কেবল ভেরিয়েবলের অ্যারে এবং ভেরিয়েবলের ক্ষেত্রে, তবে পদ্ধতিগুলির ক্ষেত্রে নয় etc.


-4

মেইন.পি থেকে প্রয়োজনীয় ফাংশনগুলি আমদানি করার চেষ্টা করবেন? সুতরাং,

from main import SomeFunction

এটি এমনও হতে পারে যে আপনি batch.py ​​তে কোনও ফাংশন নাম রেখেছেন মেইনপিসির মতো, এবং আপনি যখন মেইন.পি ইম্পোর্ট করেন তখন প্রোগ্রামটি ব্যাচ.পি ফাংশনের পরিবর্তে মেইন.পি ফাংশন চালায়; উপরের কাজটি ঠিক করা উচিত। আমি আশা করি.


কমপক্ষে উইন্ডোজ এ, এটি না।
মার্টন কল

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