Python betiğinin sözdizimini yürütmeden nasıl kontrol edebilirim?


368

Eskiden perl -c programfilePerl programının sözdizimini kontrol edip yürütmeden çıkardım . Bunu bir Python betiği için yapmanın eşdeğer bir yolu var mı?

Yanıtlar:


590

Sözdizimini derleyerek kontrol edebilirsiniz:

python -m py_compile script.py

9
import script, ancak tüm kod işlevlerde olmalıdır. Zaten iyi bir uygulama. Bunu kabuk komut dosyaları için bile kullandım. Buradan birim testi yapmak için küçük bir adım.
Henk Langeveld

1
enjekte edilmiş modüllere sahip gömülü bir motorunuz varsa çalışmaz
n611x007

57
python -m compileallayrıca dizinleri özyinelemeli olarak yapabilir ve daha iyi bir komut satırı arayüzüne sahiptir.
C2H5OH

9
Harika bir yanıt, ancak ".pyc" dosyası oluşturmasını nasıl önleyebilirim? Bu arada ".pyc" dosyasının kullanımı nedir?
pdubois

4
Python 2.7.9 için, ne zaman -m py_compilemevcut, ben .pyc dosyasının oluşturulmasını ne -Bde PYTHONDONTWRITEBYTECODEbastırdığını buluyorum .
DavidRR

59

Bu araçları kullanabilirsiniz:


10
Bunların hepsi sözdizimini kontrol etmekten çok daha fazlasını yapar. Gerçekten cevap bu değil.
Matt Joiner

22
Tüm bunlar sözdizimini kontrol eder, bu yüzden cevap doğrudur. Diğer kontroller (çok yararlı) bir bonus.
johndodo

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

Bunu checker.py kaydedin ve çalıştırın python checker.py yourpyfile.py.


1
Küçük bir komut dosyası koleksiyonu için Makefile için biraz fazla ağır, ancak işi yapıyor ve istenmeyen bir dosya oluşturmuyor.
proski

1
Bu eski bir yanıt, ancak dikkat edilmesi gereken bir şey, komut dosyasının başarıyla yürütülüp yürütülmeyeceğini değil, yalnızca sözdizimini kontrol ettiği.
Vallentin

Çok teşekkürler. İşe yarıyor. Sadece bir yorum, kod doğru ise cevap yoktur. Aksi takdirde, satır numaralarına sahip hata mesajları gösterilir.
musbach

5

İşte astmodülü kullanarak başka bir çözüm :

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

Bunu bir Python betiğinden temizlemek için:

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
İçe aktarılan kütüphanelerin tümünü gerektirmeyen veya .pyc dosyaları üreten harika bir astar. Teşekkürler!
mmell


1

Pyflakes istediğini yapar, sadece sözdizimini kontrol eder. Dokümanlardan:

Pyflakes basit bir söz verir: asla stilden şikayet etmez ve asla yanlış pozitifler yaymak için çok, çok zor çalışacaktır.

Pyflakes ayrıca Pylint veya Pychecker'dan daha hızlıdır. Bunun nedeni, Pyflakes'in her bir dosyanın sözdizimi ağacını tek tek incelemesi.

Yüklemek ve kullanmak için:

$ pip install pyflakes
$ pyflakes yourPyFile.py

0

nedense (ben bir py acemi ...) -m çağrı işe yaramadı ...

işte bir bash sarıcı fonk ...

# ---------------------------------------------------------
# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.