Saya biasa menggunakan perl -c programfile
untuk 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 programfile
untuk 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 compileall
juga dapat melakukan direktori secara rekursif dan memiliki antarmuka baris perintah yang lebih baik.
-m py_compile
ada, saya menemukan bahwa tidak ada -B
atau tidak PYTHONDONTWRITEBYTECODE
menekan 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 ast
modul:
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.