2010-01-08 8 views
28

मैं, pylint चेकर, संकेत त्रुटि भाग तक ही सीमित आह्वान करने के लिए मेरी इकाई परीक्षण के हिस्से के रूप चाहते हैं। तो मैं pylint निष्पादन स्क्रिप्ट की जाँच की, pylint.lint.Run सहायक वर्ग के लिए मिला है और वहाँ मैं एक काफी लंबा __init__ समारोह में खो गया, sys.exit() के लिए एक कॉल के साथ समाप्त।प्रेरक pylint प्रोग्राम के रूप में

किसी को भी कभी कोशिश की है और ऐसा करने में कामयाब रहे?

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

किसी भी संकेत:

सपना योजना इस होगा? "__init__ विधि की प्रतिलिपि बनाएँ और sys.exit()" को छोड़ दें, मेरा मतलब है? pylint से चलाने के लिए

मैं परीक्षण की जरूरत नहीं करते हैं, यह रूप में अच्छी तरह हो सकता है pyflakes या अन्य सॉफ्टवेयर: विकल्प सुझाने के लिए स्वतंत्र लग रहा है। धन्यवाद!

उत्तर

20

pylint/epylint.py पर एक नज़र डालें जिसमें दो प्रोग्रामिक रूप से पिलिंट शुरू करने के विभिन्न तरीके शामिल हैं।

तुम भी बस फोन कर सकते हैं:

from pylint.lint import Run 
Run(['--errors-only', 'myfile.py']) 
उदाहरण के लिए

+0

पिछले उत्तर के साथ संयुक्त। और मामूली संशोधन के साथ: 'pylint.lint.Run ([' - त्रुटियों-केवल ', फ़ाइल नाम])' – mariotomo

+0

प्रोग्रामिंग रूप से पिलिंट का आविष्कार करते समय एकाधिक फ़ाइलों को पार्स करने का कोई तरीका है? – Gobliins

+0

@gobliins: हाँ, रन तर्क के रूप में दी गई सूची में अन्य फ़ाइल नामों को बस संलग्न करें। – sthenault

3

मुझे खुशी है कि मैं इस में आए हूँ।

# 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 ऊपर में तार जैसे की एक सूची है: मैं के साथ आने के उत्तर यहां और कुछ पहल से कुछ का इस्तेमाल किया। ["-r", "n", "myfile.py"]

+2

पर ध्यान देने के लिए धन्यवाद, मैंने उपरोक्त समाधान दिया है, लेकिन मुझे तब से पता चला है कि पिलिंट प्रोग्रामिंग रूप से इस तरह से बुरी तरह खराब है क्योंकि पिलिंट आयातित करता है जो कैश किए जाते हैं। तो अगर आपने फ़ाइल को संपादित किया था तो आप लिफ्टिंग कर रहे थे, बदलाव नहीं देखा जाएगा। यदि आप केवल एक स्क्रिप्ट के खिलाफ प्रोग्रामिंग के बाद पिलिंट चला रहे हैं, तो यह शायद ठीक है। – mcarans

14

मुझे हाल ही में एक ही समस्या मिली है। syt सही है, pylint.epylint वहां कई विधियां मिलीं। हालांकि वे सभी एक उपप्रजाति कहते हैं जिसमें पाइथन फिर से लॉन्च किया जाता है। मेरे मामले में, यह काफी धीमी हो रही थी।

mcarans जवाब से

भवन, और पाने के एक झंडा बाहर निकलें है कि वहाँ, मैं निम्नलिखित

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... 

जो मेरे मामले में के बारे में 3 गुना तेजी से किया था। इसके साथ मैं प्रत्येक स्रोत फ़ाइल को जांचने, त्रुटियों को इंगित करने और उनके नोट से सभी फ़ाइलों को रैंक करने के लिए पूर्ण आउटपुट का उपयोग करके पूरी परियोजना के माध्यम से जा रहा हूं।

+1

क्या आप मुझे उस स्रोत पर पेंट कर सकते हैं जहां मैं इसके बारे में पढ़ सकता हूं। –

+0

धन्यवाद, यह काम करता है! यहां वह कोड है जो आउटपुट को पार करता है और रेटिंग देता है (अगर आपको पसंद है तो जवाब में जोड़ने के लिए स्वतंत्र महसूस करें): https://pastebin.com/Lta2cCB8 –

+0

आप भी इसका उपयोग करते हैं: pylint_output = pylint.testutils.TestReporter() और फिर test_reporter.finalize()। स्ट्रिप() के साथ परिणाम प्राप्त करें। या इससे भी बेहतर, 'टेस्ट रिपोर्टर' के कार्यान्वयन को देखें और संरचनात्मक संदेशों को संभालने के लिए स्वयं को कार्यान्वित करें। –

1

WritableObject क्लास बनाने के बजाय हम स्ट्रिंगियो का उपयोग कर सकते हैं। स्ट्रिंगियो में लेखन विधि है।

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')) 

स्रोत:

0

pylint के लिए एक और प्रवेश बिंदु epylint.py_run समारोह है, कि stdout लागू और stderr अवरोध।लेकिन, जैसा कि निम्न कोड में दिखाया गया है, pylint 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()) 

अब, मैं CLI से CLI और pylint से कि 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()) 

के रूप में वर्णित here, pylint खुद को पार्स प्रदर्शन करेंगे, और सही ढंग से उत्पादन stdout में अपेक्षित परिणाम होगा।

संबंधित मुद्दे