2010-01-08 10 views
28

Tôi muốn gọi trình kiểm tra pylint, giới hạn ở phần báo hiệu Lỗi, như một phần của thử nghiệm đơn vị của tôi. vì vậy tôi đã kiểm tra kịch bản lệnh thực thi pylint, đã truy cập lớp trợ giúp pylint.lint.Run và ở đó tôi bị mất chức năng khá dài __init__, kết thúc bằng một cuộc gọi đến sys.exit().gọi pylint theo chương trình

ai đã từng thử và quản lý để làm như vậy?

giấc mơ-kế hoạch sẽ là:

if __name__ == '__main__': 
    import pylint.lint 
    pylint.lint.something(__file__, justerrors=True) 
    # now continue with unit testing 

bất kỳ gợi ý? khác hơn là "sao chép phương thức __init__ và bỏ qua sys.exit()", ý tôi là?

Tôi không cần các thử nghiệm sẽ được chạy bởi pylint, nó cũng có thể là pyflakes hoặc phần mềm khác: vui lòng đề xuất các lựa chọn thay thế. cảm ơn!

Trả lời

20

Hãy xem pylint/epylint.py có chứa hai các cách khác nhau để bắt đầu pylint theo chương trình.

Bạn cũng có thể chỉ cần gọi:

from pylint.lint import Run 
Run(['--errors-only', 'myfile.py']) 

ví dụ.

+0

kết hợp với câu trả lời trước. và với sửa đổi nhỏ: 'pylint.lint.Run (['- chỉ có lỗi', tên tệp])' – mariotomo

+0

có cách nào để phân tích cú pháp nhiều tệp khi gọi pylint theo chương trình không? – Gobliins

+0

@gobliins: vâng, chỉ cần thêm các tên tệp khác vào danh sách được cung cấp dưới dạng Đối số chạy. – sthenault

3

Tôi rất vui vì đã gặp phải điều này. Tôi đã sử dụng một số câu trả lời ở đây và một số sáng kiến ​​để đưa ra:

# a simple class with a write method 
class WritableObject: 
    def __init__(self): 
     self.content = [] 
    def write(self, string): 
     self.content.append(string) 
pylint_output = WritableObject() 

pylint = lint.Run(args, reporter=ParseableTextReporter(pylint_output), exit=False) 

Args ở trên là danh sách các chuỗi ví dụ. ["-r", "n", "myfile.py"]

+2

Tôi đặt một giải pháp ở trên, nhưng tôi đã tìm thấy rằng Pylint gọi theo chương trình theo cách này là xấu vì Pylint sử dụng nhập được lưu trữ. Vì vậy, nếu bạn chỉnh sửa các tập tin bạn đã linting, những thay đổi sẽ không được nhìn thấy. Nếu bạn chỉ đang chạy Pylint lập trình một lần đối với một kịch bản duy nhất, thì điều này có lẽ là ok. – mcarans

14

Tôi gặp vấn đề tương tự gần đây. syt là đúng, pylint.epylint có một số phương pháp trong đó. Tuy nhiên, tất cả chúng đều gọi là một tiến trình con trong đó python được khởi chạy lại. Trong trường hợp của tôi, điều này đã nhận được khá chậm.

xây dựng từ câu trả lời mcarans, và tìm ra rằng có một lối ra cờ, tôi đã làm như sau

class WritableObject(object): 
    "dummy output stream for pylint" 
    def __init__(self): 
     self.content = [] 
    def write(self, st): 
     "dummy write" 
     self.content.append(st) 
    def read(self): 
     "dummy read" 
     return self.content 
def run_pylint(filename): 
    "run pylint on the given file" 
    from pylint import lint 
    from pylint.reporters.text import TextReporter 
    ARGS = ["-r","n", "--rcfile=rcpylint"] # put your own here 
    pylint_output = WritableObject() 
    lint.Run([filename]+ARGS, reporter=TextReporter(pylint_output), exit=False) 
    for l in pylint_output.read(): 
     do what ever you want with l... 

đó là khoảng 3 lần nhanh hơn trong trường hợp của tôi. Với điều này tôi đã trải qua toàn bộ dự án, sử dụng đầu ra đầy đủ để kiểm tra từng tệp nguồn, lỗi điểm và xếp hạng tất cả các tệp từ ghi chú của chúng.

+1

Bạn có thể vui lòng đưa tôi đến nguồn mà tôi có thể đọc về điều này không. –

+0

Cảm ơn bạn, nó hoạt động! Đây là mã phân tích đầu ra và trả về xếp hạng (cảm thấy tự do để thêm vào câu trả lời, nếu bạn thích): https://pastebin.com/Lta2cCB8 –

+0

Bạn cũng sử dụng: pylint_output = pylint.testutils.TestReporter() và sau đó nhận được kết quả với test_reporter.finalize(). strip(). Hoặc thậm chí tốt hơn, hãy nhìn vào việc thực hiện 'TestReporter' và thực hiện của riêng bạn để xử lý các thông điệp cấu trúc. –

1

Thay vì tạo lớp WritableObject, chúng ta có thể sử dụng StringIO. StringIO chứa phương thức ghi.

import sys 
try: 
    from io import StringIO 
except: 
    from StringIO import StringIO 

stdout = sys.stdout 
sys.stdout = StringIO() 

ARGS = ["-r","n", "--rcfile=rcpylint"] 
r = lint.Run(['../test.py']+ARGS, exit=False) 

test = sys.stdout.getvalue() 
sys.stdout.close() 
sys.stdout = stdout 

print (test.split('\n')) 

Nguồn:

0

Một điểm mấu chốt cho pylint là epylint.py_run chức năng, mà thực hiện các thiết bị xuất chuẩn và chặn stderr.Tuy nhiên, như trong đoạn mã sau, pylint dường như không viết báo cáo của mình trong stdout:

from pylint import epylint 

pylint_stdout, pylint_stderr = epylint.py_run(__file__, return_std=True) 
print(pylint_stdout.getvalue()) # -> there is just the final rank, no report nor message 
print(pylint_stderr.getvalue()) 

Bây giờ, tôi thấy rằng pylint từ CLI và pylint từ CLI không sử dụng các thông số mặc định như vậy. Vì vậy, bạn chỉ cần cung cấp các tham số mà bạn cần để pylint.

from pylint import epylint 
options = '--enable=all' # all messages will be shown 
options += '--reports=y' # also print the reports (ascii tables at the end) 

pylint_stdout, pylint_stderr = epylint.py_run(__file__ + ' ' + options, return_std=True) 
print(pylint_stdout.getvalue()) 
print(pylint_stderr.getvalue()) 

Như được mô tả here, pylint sẽ tự thực hiện phân tích cú pháp và sẽ xuất ra kết quả mong muốn ở chế độ xuất chuẩn.