2016-09-20 28 views
7

Aracımda komut satırı seçeneklerini ele almak için mükemmel Python Click kitaplığını kullanıyorum. İşte benim kod basitleştirilmiş bir versiyonudur (tam komut here) var:Python Click: özel hata iletisi

birisi herhangi bayraklar olmadan komutu çalışıyorsa
@click.command(
    context_settings = dict(help_option_names = ['-h', '--help']) 
) 
@click.argument('analysis_dir', 
       type = click.Path(exists=True), 
       nargs = -1, 
       required = True, 
       metavar = "<analysis directory>" 
) 

def mytool(analysis_dir): 
    """ Do stuff """ 

if __name__ == "__main__": 
    mytool() 

, aldıkları varsayılan tıklama hata iletisi:

$ mytool 

Usage: mytool [OPTIONS] <analysis directory> 

Error: Missing argument "analysis_dir". 

Bu güzel, ama ben 'Oldukça acemi kullanıcılara yardım bayrağını kullanarak daha fazla yardımın mümkün olduğunu söylemeyi çok isterim. Başka bir deyişle, komut geçersiz olduğunda, daha fazla bilgi için kullanıcılara mytool --help'u denemelerini söyleyen hata iletisine özel bir cümle ekleyin.

Bunu yapmanın kolay bir yolu var mı? required özniteliğini kaldırabildiğimi ve bu mantığı ana işlevde kaldırabileceğimi biliyorum, ancak bu küçük bir ekleme için biraz rahatsızlık hissediyor.

+0

Tam olarak aynı sorunu yaşıyorum. Bir hata olursa ya da en azından kullanıcıya yardımın nasıl yazdırılacağını söylerse, otomatik olarak yardımı yazdırmak isterim. Aksi halde, aracımızı kullanan herkesin unix tabanlı düşünmeye aşina olduğunu varsayalım. Şimdiye kadar tıklamayı çok severim ama bu sorunun yanıtlanmadığı konusunda akıl hocalığı yapıyorum, çünkü acemilerin kolaylıkla kullanabileceği araçları geliştirmeye yardımcı olacak bir şey istiyorum. – user1677663

+0

Sadece şunu buldum, bu bir çözüm olabilir: http://stackoverflow.com/questions/35642202/python-click-return-the-helper-menu – user1677663

+0

Hayır, işe yaramadı. – user1677663

cevap

3

Python-click'teki hataların çoğu için ileti yapısı, UsageError sınıfının show yöntemiyle işlenir: click.exceptions.UsageError.show.

Bu yöntemi yeniden tanımlarsanız, kendi özelleştirilmiş hata iletinizi oluşturabileceksiniz.

import click 
@click.group() 
def cli(): 
    pass 

modify_usage_error(cli) 

: Eğer ana komutu tanımladıktan sonra

def modify_usage_error(main_command): 
    ''' 
     a method to append the help menu to an usage error 

    :param main_command: top-level group or command object constructed by click wrapper 
    :return: None 
    ''' 

    from click._compat import get_text_stderr 
    from click.utils import echo 
    def show(self, file=None): 
     import sys 
     if file is None: 
      file = get_text_stderr() 
     color = None 
     if self.ctx is not None: 
      color = self.ctx.color 
      echo(self.ctx.get_usage() + '\n', file=file, color=color) 
     echo('Error: %s\n' % self.format_message(), file=file, color=color) 
     sys.argv = [sys.argv[0]] 
     main_command() 

    click.exceptions.UsageError.show = show 

, daha sonra değiştirici komut dosyası çalıştırabilirsiniz: Aşağıda bu SO question cevaplar herhangi bir hata mesajı yardım menüsü ekler bir özelleştirme örneği Kullanım hataları dışında ClickException çalışma zamanı çağırmalarının olup olmadığını incelemedim. Varsa, özel hata işleyicisini, ilk olarak, Clickexception'ın başlatma sırasında ctx beslendiği görünmediğinden, click.exceptions.ClickException.show = show satırını eklemeden önce ctx'in bir öznitelik olduğunu kontrol etmek için değiştirmeniz gerekebilir.

+0

Fantastik, teşekkürler RJ! Bu bir istisna ile mükemmel bir şekilde çalışır - son işlev çağrısını 'main_command()' e çevirmek zorunda kaldım çünkü bu bir tekrarlama hatasına neden oldu. – tallphil

+0

Bu iyi hissettirdi! https://github.com/ewels/MultiQC/commit/62cc60 Şimdi yedi ay boyunca bunu yapamama konusunda düşük bir sıkıntı yaşadım! Tekrar teşekkürler! – tallphil