Saya biasa menggunakan perl -c programfileuntuk memeriksa sintaks program Perl dan kemudian keluar tanpa menjalankannya. Apakah ada cara yang setara untuk melakukan ini untuk skrip Python?
Saya biasa menggunakan perl -c programfileuntuk memeriksa sintaks program Perl dan kemudian keluar tanpa menjalankannya. Apakah ada cara yang setara untuk melakukan ini untuk skrip Python?
Jawaban:
Anda dapat memeriksa sintaks dengan mengompilasinya:
python -m py_compile script.py
python -m compilealljuga dapat melakukan direktori secara rekursif dan memiliki antarmuka baris perintah yang lebih baik.
-m py_compileada, saya menemukan bahwa tidak ada -Batau tidak PYTHONDONTWRITEBYTECODEmenekan pembuatan file .pyc .
Anda dapat menggunakan alat ini:
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')
Simpan ini sebagai checker.py dan jalankan python checker.py yourpyfile.py.
Inilah solusi lain, menggunakan astmodul:
python -c "import ast; ast.parse(open('programfile').read())"
Untuk melakukannya dengan bersih dari dalam skrip Python:
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)
Mungkin PEP8 checker online yang berguna: http://pep8online.com/
Pyflakes melakukan apa yang Anda minta, itu hanya memeriksa sintaks. Dari dokumen:
Pyflakes membuat janji sederhana: ia tidak akan pernah mengeluh tentang gaya, dan itu akan berusaha sangat, sangat sulit untuk tidak pernah memancarkan positif palsu.
Pyflakes juga lebih cepat dari Pylint atau Pychecker. Ini sebagian besar karena Pyflakes hanya memeriksa pohon sintaks dari setiap file secara individual.
Untuk menginstal dan menggunakan:
$ pip install pyflakes
$ pyflakes yourPyFile.py
untuk beberapa alasan (saya seorang pemula py ...) panggilan -m tidak berfungsi ...
jadi di sini adalah fungsi ...
# ---------------------------------------------------------
# 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
import script, tetapi semua kode harus dalam fungsi. Yang merupakan praktik yang baik pula. Saya bahkan sudah mengadopsi ini untuk skrip shell. Dari sini, ini adalah langkah kecil menuju unit testing.