जब मैं इसे आयात करता हूं तो पायथन मेरा मॉड्यूल क्यों चला रहा है, और मैं इसे कैसे रोकूं?


173

मेरे पास एक पायथन प्रोग्राम है जो मैं बना रहा हूं जिसे 2 तरीकों में से किसी एक में चलाया जा सकता है: पहला है "अजगर मेनहोम" कॉल करना जो उपयोगकर्ता को मैत्रीपूर्ण तरीके से इनपुट के लिए प्रेरित करता है और फिर प्रोग्राम के माध्यम से उपयोगकर्ता इनपुट चलाता है। दूसरा तरीका "अजगर बैचो -फाइल- " को कॉल करना है, जो सभी फ्रेंडली इनपुट को इकट्ठा करेगा और एक ही बार में प्रोग्राम के माध्यम से पूरी फाइल के लायक इनपुट रन करेगा।

समस्या यह है कि जब मैं "बैच ओरियो" चलाता हूं, तो यह "मेनफ्रेम" से कुछ चर / विधियों / आदि का आयात करता है, और जब यह कोड आता है:

import main

कार्यक्रम की पहली पंक्ति में, यह तुरंत त्रुटिपूर्ण हो जाता है क्योंकि यह कोड को "main.py" में चलाने की कोशिश करता है।

मैं "मुख्य" मॉड्यूल में निहित कोड को चलाने से पायथन को कैसे रोक सकता हूं जो मैं आयात कर रहा हूं?

जवाबों:


251

क्योंकि यह सिर्फ पायथन काम करता है - जैसे कि कीवर्ड classऔर घोषणाएं नहींdef हैं । इसके बजाय, वे वास्तविक लाइव स्टेटमेंट हैं जिन्हें निष्पादित किया जाता है। यदि वे आपके मॉड्यूल निष्पादित नहीं किए गए थे .. तो खाली :-)

वैसे भी, मुहावरेदार दृष्टिकोण है:

# 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
बस पुष्टि करने के लिए, आपकी टिप्पणी "सामान केवल चलाने के लिए जब 'आयात' के माध्यम से नहीं बुलाया जाता है" का तात्पर्य मुख्य (), के तहत लिखे जाने वाले आदेशों से है? या इससे कोई फर्क नहीं पड़ता ??
गोल्डनेम

@Goldname आयात किए जाने पर यदि कथन के अंदर का कोड नहीं चलाया जाएगा, लेकिन मुख्य फ़ंक्शन अपने आप में परिभाषित है और आयात के माध्यम से भी उपयोग के लिए तैयार है। यह मॉड्यूल रन होने पर मुख्य फ़ंक्शन को निष्पादित करेगा, और यदि आयात नहीं किया गया है तो इसे निष्पादित नहीं करेगा। यह सब उस पर निर्भर करता है जो आप करना चाहते हैं। यदि आपको मुख्य अन्य जगहों के अंदर कमांड्स की आवश्यकता नहीं है, तो हर तरह से उन्हें इफ के अंदर लिखें। लेकिन मेरे लिए यह बकवास लगता है।
फेलिक्स

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

आप अपना "main.py" इस तरह लिख सकते हैं:

#!/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

Scipy प्रलेखन में एक पूर्ण विवरण देखें

कृपया ध्यान दें कि यह केवल चर के चर और सरणियों के लिए मामला है, और विधियों के लिए नहीं, आदि।


-4

मेनफ्रेम से आवश्यक कार्यों को आयात करने का प्रयास करें? इसलिए,

from main import SomeFunction

यह हो सकता है कि आपने बैच-इन में एक फ़ंक्शन को नाम दिया है जो मुख्य-थिंकपैड में एक है, और जब आप मेन-थ्रो को आयात करते हैं, तो प्रोग्राम बैच-थ्रू फ़ंक्शन के बजाय मेन-थ्रो फ़ंक्शन चलाता है; उपरोक्त को ठीक करना चाहिए। मुझे उम्मीद है।


कम से कम विंडोज पर, यह नहीं है।
मार्टीन कोल

2
import mainवर्तमान नाम स्थान में मुख्य से सब कुछ आयात नहीं करता है। यह केवल mainवर्तमान नामस्थान में एक ही प्रतीक जोड़ता है , इसलिए टकराव नहीं हो सकता है।
रेमित्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.