2012-11-09 10 views
26

अगर मैं इंटरैक्टिव मोड और प्रकार को खोलने:क्या आप पाइथन में __builtins__ को पुन: असाइन करने से पुनर्प्राप्त कर सकते हैं?

__builtins__ = 0 # breaks everything 

मैं पूरी तरह से सत्र हड्डी टूट गई है? यदि हां, तो बिल्टिन मॉड्यूल को __builtins__ असाइन करने के लिए दृश्यों के पीछे क्या चल रहा है जिसे दुभाषिया द्वारा नियंत्रित नहीं किया जा सकता है? यदि नहीं, तो मैं इससे कैसे ठीक हो सकता हूं?

बस अपने ही इसे ठीक करने के प्रयास के कुछ:

  • एक त्रुटि में कुछ भी परिणाम आयात करने के लिए कोई भी प्रयास "ImportError नहीं मिला __import__"
  • सभी कार्यों मैं मूल्यांकन के अलावा अन्य कुछ भी करने को इस्तेमाल कर सकते हैं संख्यात्मक अभिव्यक्ति टूटी हुई हैं
  • एक और चर __package__ अभी भी सुलभ है, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जा सकता है।

उत्तर

29

आमतौर पर आपको __builtins__ हटा दिए जाने पर भी आपको जो भी चाहिए, उस तक पहुंच प्राप्त हो सकती है। यह सिर्फ इतना खोदने का मामला है। उदाहरण के लिए:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> __builtins__ = 0 
>>> open 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'open' is not defined 
>>> dir 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'dir' is not defined 
>>> int 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'int' is not defined 
>>> float 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'float' is not defined 
>>> 
>>> __builtins__ = [t for t in().__class__.__bases__[0].__subclasses__() if 'warning' in t.__name__][0]()._module.__builtins__ 
>>> 
>>> open 
<built-in function open> 
>>> int 
<type 'int'> 
>>> float 
<type 'float'> 
>>> 

क्या बिल्ली बस यहाँ क्या हुआ की एक विवरण के लिए, Eval really is dangerous, जहां इसी तरह की तकनीकों का प्रदर्शन करने की है कि आप सुरक्षित रूप से अविश्वसनीय अजगर कोड निष्पादित नहीं कर सकते हैं उपयोग किया जाता है पढ़ें।

+0

बस इसे अजगर 3 में चलाने की कोशिश की .. एक त्रुटि मिली। विशेष रूप से, यह: [टी के लिए टी() .__ वर्ग __.__ बेस __ [0] .__ उपclasses __() टी .__ नाम__ में 'चेतावनी'] [] जब मैं इसे चलाने का प्रयास करता हूं तो विस्तार करता है। शायद यह अजगर 3 बनाम 2 के साथ एक समस्या है? –

+0

Slick! क्या वास्तव में सत्र को पूरी तरह से तोड़ने का कोई तरीका है? – acjay

+4

@ हार्टसिमा: पाइथन 2 प्रतिबंधित मोड को सक्षम करता है यदि वर्तमान फ्रेम में बिल्टिन दुभाषिया बिल्टिन से अलग है।चूंकि प्रतिबंधित मोड को पायथन 3 में हटा दिया गया था, इसलिए फ़ंक्शन से '__builtins__' प्राप्त करने के लिए इस उत्तर को संशोधित करना आसान है:' __builtins__ = [टी में() .__ वर्ग __.__ आधार __.__ उपclasses __() टी .__ name__ == 'आकार '] [0] .__ लेन __.__ वैश्विक __ [' __ builtins __ '] '। – eryksun

3

मूल रूप से संरक्षित और आरक्षित नामों के साथ गड़बड़ करना आपके सत्र को तोड़ने का मतलब है, कभी-कभी ठीक होने के तरीके के बिना।

उदाहरण के लिए, आप खोल में लिख सकते हैं:

True = False # The chaos begins! 

ये अन्य प्रोग्रामिंग भाषाओं के साथ संभव नहीं हैं, लेकिन अजगर आप आप क्या चाहते करने की सुविधा देता है, भले ही यह सब कुछ निकाल लेंगे।

+0

मुझे एक सिंटेक्स त्रुटि मिलती है जब मैं सही = गलत कहता हूं, टूटे हुए खोल में भी। यदि सत्र पूरी तरह से टूटा हुआ है, तो \ _ \ _ buildins \ _ \ _ को पहले स्थान पर पाइथन में मॉड्यूल में कैसे असाइन किया जाता है। मुझे लगता है कि दुभाषिया इसे एक अस्पष्ट बयान और शायद किसी प्रकार की निम्न-स्तरीय फ़ाइल पहुंच का उपयोग करके प्रारंभ करता है। लेकिन यदि नहीं, तो कैसे ** ** ** डिजाइन किए गए हैं। –

+7

यह केवल पायथन 2 में काम करता है। पायथन 3 आपको कीवर्ड को चीजों को असाइन करने की अनुमति नहीं देगा। लेकिन यहां तक ​​कि पायथन 2 में भी यह आसानी से तय किया जाता है: 'गलत = (गलत गलत नहीं है)' और 'सत्य = झूठा नहीं' और आप मूल पर वापस आ गए हैं। – poke

3

आप सही हैं; आप व्यावहारिक रूप से एक पायथन सत्र तोड़ सकते हैं। मुझे संदेह है कि इसे पूरी तरह से नष्ट करने का एक तरीका है - नेड का जवाब मुझे काफी रहस्योद्घाटन था।

एक बहुत गतिशील भाषा होने के नाते, पायथन आपको अपने आप को लटकने के लिए बहुत सारी रस्सी देता है। इसे दोष के रूप में न देखें, यद्यपि; एक आम पायथन नारा कहता है कि "हम सभी यहां वयस्कों की सहमति दे रहे हैं।" यदि आप भाषा को समझते हैं और वास्तव में जानते हैं कि आप क्या कर रहे हैं, तो आपके पास पाइथन के मूल रूप से हर पहलू पर नियंत्रण की पागल मात्रा है।

+2

यह वास्तव में सच है। यही कारण है कि सदस्यों के लिए 'सार्वजनिक' और 'निजी' जैसी कोई पहुंच योग्यता नहीं है। कुछ उपयोग करते समय, आपको आंतरिक कार्यान्वयन से बाहर रहने की उम्मीद है जबतक कि आप वास्तव में नहीं जानते कि आप क्या करते हैं। – poke

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

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