2013-02-06 10 views
31

Bunun mümkün olduğunu sanmıyorum, ancak argparse istisnasının üstesinden gelmek istiyorum. ÖrneğinPython argparse kullanımı yerine bir istisna atmak istiyorum.

:

$ myapp.py 
usage: myapp --foo foo 
myapp: error: argument --foo is required 

Ama bunun yerine istisna düşmek istiyorum:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', help='foo help', required=True) 
try: 
    args = parser.parse_args() 
except: 
    do_something() 

Ben çalıştırın.

+2

Bunun için tasarlandığı şey için argparse kullanmıyorsunuz. Ne yapmak istiyorsun? –

+9

Başka bir büyük kütüphanenin çalışma şeklini değiştirmek, sadece belirli bir projeye ayarlamak için kötü bir şey değildir. – jdborg

+4

Aslında bunu zaten yapabilirsiniz. SystemExit'i yakalayın ve 'sys.stderr' yerine başka bir nesne ile değiştirin. – Bakuriu

cevap

55

Sen ArgumentParser alt sınıf ve bir hata oluştuğunda farklı bir şey yapmak error yöntemi geçersiz kılabilirsiniz: benim durumumda

class ArgumentParserError(Exception): pass 

class ThrowingArgumentParser(argparse.ArgumentParser): 
    def error(self, message): 
     raise ArgumentParserError(message) 

parser = ThrowingArgumentParser() 
parser.add_argument(...) 
... 
+0

Bunun böyle bir şey olacağını düşündüm. Açık cevap için teşekkürler. – jdborg

+3

Böyle bir şeyden kaçınmayı umuyordum, bunun bir seçenek olduğuna sevindim. Görüyorsunuz, "hata: çok az argüman" bildirimi aldığımda yardım menüsünü yazdırmaya çalışıyorum; argparse kurulumum başarılı bir şekilde çalışması için en az bir argüman gerektirir, ancak betiğin "-h" parametresiyle çalıştırmak zorunda kalmadan, bu komutların ne olduğunu yazmanın kibarca olacağını tahmin ediyorum. Bir şey gibi: 'parser.set_error ('çok az argüman', method_to_deal_with_error)' Bu özelliği istiyorsanız, her zaman bir hata oluşturabilirim. Teşekkürler! – NuclearPeon

12

, argparse baskılar 'çok az argümanlar' yazıp çıkın. argparse kodunu okuduktan sonra, bazı mesajlar yazdıktan sonra sys.exit() işlevini çağırdığını buldum. sys.exit() gibi bir şey yapmadığı gibi bir SystemExit istisnası atar, sadece bu istisnayı yakalayabilirsiniz.

Bu nedenle, sizin için çalışıp çalışmadığını görmek için bunu deneyin.

try: 
     args = parser.parse_args(args) 
    except SystemExit: 
     .... your handler here ... 
     return 
+1

Evet, bu seçenek Bakuriu'nun yorumunda yukarıda belirtilmiştir. Unittesting 'test_argparse.py' dosyası, 'ErrorRaisingArgumentParser' sınıfı oluşturmak için' error''i yeniden tanımlamakla birlikte bu yaklaşımı kullanır. – hpaulj

+3

hata mesajı stderr'de dışarı atılır. Onu yakalamanın bir yolu var mı? – Raj

+1

@Raj Stderr'yi başka bir akış/dosya nesnesine geçici olarak yeniden yönlendirebilirsiniz, örneğin: https://stackoverflow.com/a/6796752/2128769 – umi

İlgili konular