2013-04-01 3 views
5

जब मैं चलाएँ:अजगर कार्यकारी और __name__

exec "print __name__" 

यह __main__ प्रिंट करता है।

लेकिन जब मैं चलाएँ:

exec "print __name__" in {} 

यह __builtin__ प्रिंट करता है।

__main__ प्रिंट करने के लिए दूसरा उदाहरण कैसे बनाएं?

मैं जो हासिल करने का प्रयास करता हूं वह exec के साथ कोड का एक टुकड़ा चलाने के लिए है ताकि ऐसा लगता है कि यह कमांड लाइन से चलाया गया था।

मैं साफ़ दायरे के साथ कोड को ट्यून करना चाहता हूं लेकिन दूसरा उदाहरण कोड को if __name__ == "__main__" पर भरोसा करता है। इसे कैसे ठीक करें?

उत्तर

4

आप imp.load_module बजाय इस्तेमाल कर सकते हैं:

import imp 

with open(mainfile) as src: 
    imp.load_module('__main__', src, mainfile, (".py", "r", imp.PY_SOURCE)) 

यह __main__ मॉड्यूल के रूप में फ़ाइल आयात करता है, यह क्रियान्वित।

ध्यान दें कि टाइप imp.PY_SOURCE पर सेट होने पर वास्तविक फ़ाइल ऑब्जेक्ट लेता है, इसलिए यदि आपका स्रोत कोड किसी फ़ाइल के अलावा कहीं से आता है तो आपको इसके लिए एक अस्थायी फ़ाइल बनाना होगा।

अन्यथा, हमेशा __name__ मैन्युअल रूप से सेट कर सकते हैं:

>>> src = '''\ 
... if __name__ == '__main__': print 'Main!' 
... else: print 'Damn', __name__ 
... ''' 
>>> exec src 
Main! 
>>> exec src in {} 
Damn __builtin__ 
>>> exec src in {'__name__':'__main__'} 
Main! 
+0

दुर्भाग्य से मैं डिस्क पर एक अस्थायी फ़ाइल नहीं बना सकता। सादे स्ट्रिंग को निष्पादित करने का कोई तरीका नहीं है जैसे कि यह कमांड लाइन से चलाया गया हो? और आपके उत्तर के बारे में एक और सवाल: ऐसा लगता है जैसे यह आयात कर रहा था (जैसा कि 'आयात' में) फ़ाइल - क्या यह फ़ाइल आयात या निष्पादित करता है? क्या कोई अंतर है? –

+0

मॉड्यूल आयात करने के लिए, इसे * निष्पादित किया जाना है। –

+0

ध्यान दें कि '__name__ ==' __main __ '' कामों की अपेक्षा का अर्थ है कि आप यहां मॉड्यूल निष्पादित कर रहे हैं। –

0

एक समाधान अपने exec संविधान dict में स्पष्ट रूप से __name__ प्रदान करना है:

exec "print __name__" in {'__name__': '__main__'} 
+0

यह सुरक्षित है? मेरा मतलब है प्रश्न से कोड के बीच एकमात्र अंतर है और कमांड लाइन से कोड को केवल इस फिक्स पर चला रहा है? मुझे पता है कि '__doc__' जैसी अधिक चाबियाँ हैं लेकिन क्या यह कमांड लाइन से कोड की तरह दिखने के लिए आवश्यक है? –

संबंधित मुद्दे