Làm cách nào để kiểm tra cú pháp của tập lệnh Python mà không thực hiện nó?


368

Tôi đã từng sử dụng perl -c programfileđể kiểm tra cú pháp của chương trình Perl và sau đó thoát mà không thực hiện nó. Có cách nào tương đương để làm điều này cho tập lệnh Python không?

Câu trả lời:


590

Bạn có thể kiểm tra cú pháp bằng cách biên dịch nó:

python -m py_compile script.py

9
import script, nhưng tất cả các mã phải có trong các chức năng. Đó là thực hành tốt anyway. Tôi thậm chí đã áp dụng điều này cho các kịch bản shell. Từ đây là một bước nhỏ để thử nghiệm đơn vị.
Henk Langeveld

1
sẽ không hoạt động nếu bạn có một công cụ nhúng với các mô-đun được tiêm
n611x007

57
python -m compileallcũng có thể làm các thư mục đệ quy và có giao diện dòng lệnh tốt hơn.
C2H5OH

9
Câu trả lời tuyệt vời, nhưng làm cách nào tôi có thể ngăn chặn nó để tạo tệp ".pyc"? Bằng cách nào, việc sử dụng tệp ".pyc" là gì?
pdubois

4
Đối với Python 2.7.9, khi -m py_compilecó mặt, tôi thấy rằng -Bcũng không PYTHONDONTWRITEBYTECODEngăn chặn việc tạo tệp .pyc .
DavidRR

59

Bạn có thể sử dụng các công cụ này:


10
Tất cả những điều này làm nhiều hơn là kiểm tra cú pháp. Thực sự đây không phải là câu trả lời.
Matt Joiner

22
Tất cả những điều này kiểm tra cú pháp, vì vậy câu trả lời là chính xác. Các kiểm tra khác là một phần thưởng (rất hữu ích).
johndodo

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

Lưu cái này dưới dạng checker.py và chạy python checker.py yourpyfile.py.


1
Một chút quá nặng cho Makefile cho một bộ sưu tập tập lệnh nhỏ, nhưng nó thực hiện công việc và không tạo ra bất kỳ tệp không mong muốn nào.
proski

1
Đó là một câu trả lời cũ, nhưng một điều cần chú ý là điều này chỉ kiểm tra cú pháp, chứ không phải nếu tập lệnh sẽ thực thi thành công.
vallentin

Cảm ơn rất nhiều. Nó hoạt động. Chỉ cần một nhận xét, không có câu trả lời nếu mã là chính xác. Nếu không, thông báo lỗi với số dòng được hiển thị.
musbach

5

Đây là một giải pháp khác, sử dụng astmô-đun:

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

Để làm điều đó rõ ràng từ trong tập lệnh 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)

1
Một lớp lót tuyệt vời không yêu cầu tất cả các lib được nhập hoặc tạo các tệp .pyc. Cảm ơn!
mmell


1

Pyflakes làm những gì bạn yêu cầu, nó chỉ kiểm tra cú pháp. Từ các tài liệu:

Pyflakes đưa ra một lời hứa đơn giản: nó sẽ không bao giờ phàn nàn về phong cách, và nó sẽ cố gắng rất, rất khó để không bao giờ phát ra những thông tin sai lệch.

Pyflakes cũng nhanh hơn Pylint hoặc Pychecker. Điều này phần lớn là do Pyflakes chỉ kiểm tra cây cú pháp của từng tệp riêng lẻ.

Để cài đặt và sử dụng:

$ pip install pyflakes
$ pyflakes yourPyFile.py

0

vì một số lý do (tôi là một người mới chơi py ...) cuộc gọi -m không hoạt động ...

Vì vậy, đây là một gói bash func ...

# ---------------------------------------------------------
# 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.