मैं इसे निष्पादित किए बिना पायथन स्क्रिप्ट के वाक्यविन्यास की जांच कैसे कर सकता हूं?


368

मैं perl -c programfileएक पर्ल प्रोग्राम के सिंटैक्स की जांच करने और फिर इसे निष्पादित किए बिना बाहर निकलने के लिए उपयोग करता था। क्या पायथन स्क्रिप्ट के लिए ऐसा करने का एक समान तरीका है?

जवाबों:


590

आप इसे संकलित करके वाक्यविन्यास की जाँच कर सकते हैं:

python -m py_compile script.py

9
import script, लेकिन सभी कोड कार्यों में होना चाहिए। जो वैसे भी अच्छा अभ्यास है। मैंने इसे शेल स्क्रिप्ट के लिए भी अपनाया है। यहाँ से यह इकाई परीक्षण के लिए एक छोटा कदम है।
हेनक लैंगवेल्ड

1
यदि आपके पास अंतःस्थापित इंजन के साथ एम्बेडेड इंजन है तो काम नहीं करेगा
n611x007

57
python -m compileallपुनरावर्ती निर्देशिका भी कर सकते हैं और एक बेहतर कमांड लाइन इंटरफ़ेस है।
C2H5OH

9
शानदार जवाब, लेकिन मैं इसे ".pyc" फ़ाइल बनाने के लिए कैसे रोक सकता हूं? वैसे ".pyc" फ़ाइल का उपयोग क्या है?
pdubois

4
अजगर 2.7.9 के लिए, जब -m py_compileमौजूद है, मुझे लगता है कि न तो खोजने कर रहा हूँ -Bऔर न ही PYTHONDONTWRITEBYTECODEदबा के निर्माण .pyc फ़ाइल।
डेविड आरआर

59

आप इन उपकरणों का उपयोग कर सकते हैं:


10
ये सभी सिंटैक्स की जाँच से बहुत अधिक हैं। वास्तव में इसका जवाब नहीं है।
मैट जॉइनर

22
ये सभी सिंटैक्स की जांच करते हैं, इसलिए उत्तर सही है। अन्य चेक एक (बहुत उपयोगी) बोनस हैं।
जॉन्डोडो

19
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')

इसे checker.py के रूप में सहेजें और चलाएँ python checker.py yourpyfile.py


1
एक छोटे से स्क्रिप्ट संग्रह के लिए मेकफिल के लिए थोड़ा बहुत भारी है, लेकिन यह काम करता है और किसी भी अवांछित फ़ाइल का उत्पादन नहीं करता है।
०२:०१ पर प्रोस्की

1
यह एक पुराना उत्तर है, लेकिन ध्यान देने वाली बात यह है कि यह केवल वाक्यविन्यास की जाँच करता है, न कि यदि स्क्रिप्ट सफलतापूर्वक निष्पादित होती है।
vallentin

बहुत बहुत धन्यवाद। यह काम करता हैं। सिर्फ एक टिप्पणी, अगर कोड सही है तो कोई जवाब नहीं है। अन्यथा पंक्ति संख्याओं के साथ त्रुटि संदेश दिखाए जाते हैं।
मुशबिक

5

यहाँ astमॉड्यूल का उपयोग कर एक और समाधान है :

python -c "import ast; ast.parse(open('programfile').read())"

इसे पायथन लिपि के भीतर से सफाई से करने के लिए:

import ast, traceback

filename = 'programfile'
with open(filename) as f:
    source = f.read()
valid = True
try:
    ast.parse(source)
except SyntaxError:
    valid = False
    traceback.print_exc()  # Remove to silence any errros
print(valid)

1
बहुत बढ़िया एक-लाइनर जिसे सभी आयातित कामों या उत्पादन की आवश्यकता नहीं है। पीपीसी फाइलें। धन्यवाद!
mmell


1

Pyflakes क्या आप पूछते हैं, यह सिर्फ वाक्यविन्यास की जाँच करता है। डॉक्स से:

Pyflakes एक सरल वादा करता है: यह शैली के बारे में कभी भी शिकायत नहीं करेगा, और यह बहुत कोशिश करेगा कि झूठी सकारात्मक चीजों का कभी भी उत्सर्जन न करें।

पायफ्लेक्स पाइलिंट या पाइसेचर से भी तेज है। यह बड़े पैमाने पर है क्योंकि Pyflakes केवल व्यक्तिगत रूप से प्रत्येक फ़ाइल के वाक्यविन्यास वृक्ष की जांच करता है।

स्थापित करने और उपयोग करने के लिए:

$ pip install pyflakes
$ pyflakes yourPyFile.py

0

किसी कारण के लिए (मैं एक py नौसिखिया हूँ ...) -m कॉल काम नहीं किया ...

तो यहाँ एक बकवास आवरण है ...

# ---------------------------------------------------------
# check the python synax for all the *.py files under the
# <<product_version_dir/sfw/python
# ---------------------------------------------------------
doCheckPythonSyntax(){

    doLog "DEBUG START doCheckPythonSyntax"

    test -z "$sleep_interval" || sleep "$sleep_interval"
    cd $product_version_dir/sfw/python
    # python3 -m compileall "$product_version_dir/sfw/python"

    # foreach *.py file ...
    while read -r f ; do \

        py_name_ext=$(basename $f)
        py_name=${py_name_ext%.*}

        doLog "python3 -c \"import $py_name\""
        # doLog "python3 -m py_compile $f"

        python3 -c "import $py_name"
        # python3 -m py_compile "$f"
        test $! -ne 0 && sleep 5

    done < <(find "$product_version_dir/sfw/python" -type f -name "*.py")

    doLog "DEBUG STOP  doCheckPythonSyntax"
}
# eof func doCheckPythonSyntax
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.