2011-12-28 31 views
10

बिना पाइथन के जोर() को अक्षम करना मैं एक अलग सॉफ़्टवेयर के अंदर से एक पायथन स्क्रिप्ट चला रहा हूं (यह अपने डेटा संरचनाओं में हेरफेर करने के लिए एक अजगर इंटरफ़ेस प्रदान करता है)।बिना 0 -0 ध्वज

मैं अपने कोड को गति के लिए अनुकूलित कर रहा हूं और देखना चाहता हूं कि मेरे आवेषण प्रदर्शन पर क्या प्रभाव पड़ता है।

मैं python -O का उपयोग करने में असमर्थ हूं। पाइथन कोड में सभी आवेषणों को प्रोग्रामिक रूप से अक्षम करने के लिए मेरे पास अन्य विकल्प क्या हैं? चर __debug__ (जो -O झंडा द्वारा मंजूरी दे दी है)

उत्तर

9

The docs say,

अंतर्निहित वैरिएबल [__debug__] जब दुभाषिया शुरू होता है निर्धारित किया जाता है।

के लिए मूल्य :(करने के लिए आवंटित नहीं किया जा सकता

इसलिए, यदि आप नियंत्रित नहीं कर सकते कि कैसे अजगर दुभाषिया शुरू कर दिया है, तो ऐसा लगता है जैसे आप ज़ोर अक्षम नहीं कर सकता लग रहा है।

यहां कुछ अन्य विकल्प हैं:

  1. सबसे सुरक्षित तरीका सभी जोरदार विवरणों को मैन्युअल रूप से निकालना है।
  2. अपने सभी ज़ोर बयान खुद से लाइनों पर पाए जाते हैं, तो शायद आप उन लोगों के साथ

    sed -i 's/assert /pass #assert /g' script.py 
    

    नोट अन्य कोड ज़ोर के बाद आता है कि यह आपके कोड वध करना होगा हटाने सकता है। उदाहरण के लिए, ऊपर एसईडी आदेश टिप्पणी से बाहर हैं return इस तरह एक लाइन में:

    assert x; return True 
    

    जो अपने कार्यक्रम के तर्क बदल जाएगा।

    यदि आपके पास ऐसा कोड है, तो शायद मैन्युअल रूप से आवेषण को हटाने के लिए सबसे अच्छा होगा।

  3. वहाँ एक तरीका है कि उन्हें tokenize मॉड्यूल के साथ अपने स्क्रिप्ट को पार्स, लेकिन दूर करने के लिए इस तरह के एक कार्यक्रम लिख कर प्रोग्राम के रूप में दूर करने के लिए हो सकता है इस बात पर ज़ोर अधिक समय लग सकता है की तुलना में यह मैन्युअल दूर करने के लिए दावा है ले जाएगा, खासकर अगर यह एक बार नौकरी है।

  4. सॉफ्टवेयर के अन्य टुकड़ा फ़ाइलों .pyc स्वीकार करता है, फिर वहाँ जो मेरे मशीन पर काम करने के लिए लगता है एक गंदा चाल, हालांकि टिप्पणी a Python core developer warns against this (2011-09-17 पर देखें एरिक अराउजो की टिप्पणी)। मान लें कि आपकी स्क्रिप्ट को script.py कहा जाता है।

    import script 
    
  5. भागो python -O temp.py:

    • , कहा जाता है कहते हैं एक अस्थायी स्क्रिप्ट, temp.py करें। यह script.pyo बनाता है।

    • script.py और script.pyc (यदि यह मौजूद है) अपने PYTHONPATH से बाहर या अन्यस्क्रिप्ट खोजने के लिए जो भी निर्देशिका पढ़ रही है, उसे ले जाएं।
    • नाम बदलें script.pyo ->script.pyc

    अब जब अन्य सॉफ्टवेयर अपनी स्क्रिप्ट आयात करना चाहता है, यह केवल pyc फ़ाइल है, जो हटा दावा है मिल जाएगा।

    उदाहरण के लिए

    , अगर script.py दिखता है इस तरह:

    assert False 
    print('Got here') 
    

    तो चल python temp.py अब Got here बजाय एक AssertionError जुटाने की प्रिंट होगा।

+0

छोटा फिक्स:/assert/pass # assert/g। अन्यथा 'if' शाखाएं केवल एक' assert' कथन के साथ संकलित करने में विफल हो जाएगी :) – pbp

+0

धन्यवाद; वह एक अच्छा विचार है। – unutbu

0

जैसा कि @unutbu वर्णन करता है, ऐसा करने का कोई आधिकारिक तरीका नहीं है। हालांकि, एक सरल रणनीति _test की तरह एक झंडा कहीं परिभाषित करने के लिए है (उदाहरण के लिए, कीवर्ड तर्क के रूप में एक समारोह के लिए, या एक मॉड्यूल में एक वैश्विक चर के रूप में), तो अपने ज़ोर बयान में यह शामिल इस प्रकार है:

def f(x, _test=True): 
    assert not _test or x > 0 
    ... 

फिर यदि आवश्यक हो तो आप उस फ़ंक्शन में आवेषण अक्षम कर सकते हैं।

f(x, _test=False) 
1

आप this other answer में वर्णित के रूप में एक वातावरण चर के साथ ऐसा करने में सक्षम हो सकता है। PYTHONOPTIMIZE=1 सेट करना -O विकल्प के साथ पाइथन शुरू करने के बराबर है। उदाहरण के लिए, इस Blender 2.78 में काम करता है, जो अजगर 3.5 एम्बेड करता है:

blender --python-expr 'assert False; print("foo")' 

PYTHONOPTIMIZE=1 blender --python-expr 'assert False; print("foo")' 

पहले आदेश प्रिंट ट्रैसबैक, जबकि दूसरे सिर्फ "foo" प्रिंट करता है।

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