2015-02-20 6 views
8

inputdir adlı gerekli bir argümanı belirtmek istiyorum, ancak aynı zamanda i adı verilen kısa bir versiyonunu kullanmak istiyorum. Hem isteğe bağlı argümanlar yapmadan hem de kendi kontrolümü yapmadan bunu yapmak için özlü bir çözüm görmüyorum. Göremediğim bir uygulama var mı, yoksa tek yol, hem opsiyonel hem de hata yapma işlemimi gerçekleştirmekti mi?Python Argparse kullanarak gerekli bir argümanın kısa ve uzun versiyonunu nasıl yapılır?

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("inputdir", help="Specify the input directory") 
parser.parse_args() 

cevap

11

bayrakları için (- veya -- ile başlayan seçenekler) bayraklarıyla seçenekleri geçmek:

İşte benim kodudur. Birden seçenekleri belirleyebilirsiniz:

parser.add_argument('-i', '--inputdir', help="Specify the input directory") 

Bkz name or flags option documentation: add_argument() yöntem isteğe bağlı argüman, -f veya --foo veya dosya adları listesi gibi bir pozisyonel argüman gibi, olup olmadığını bilmek gerekir

beklenen. Bu nedenle, add_argument()'a iletilen ilk argümanlar, ya bir dizi bayrak ya da basit bir argüman adı olmalıdır.

Demo:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-i', '--inputdir', help="Specify the input directory") 
_StoreAction(option_strings=['-i', '--inputdir'], dest='inputdir', nargs=None, const=None, default=None, type=None, choices=None, help='Specify the input directory', metavar=None) 
>>> parser.print_help() 
usage: [-h] [-i INPUTDIR] 

optional arguments: 
    -h, --help   show this help message and exit 
    -i INPUTDIR, --inputdir INPUTDIR 
         Specify the input directory 
>>> parser.parse_args(['-i', '/some/dir']) 
Namespace(inputdir='/some/dir') 
>>> parser.parse_args(['--inputdir', '/some/dir']) 
Namespace(inputdir='/some/dir') 

Ancak gerekli bağımsız değişkenler için ilk unsur sadece bir yer tutucudur. - ve -- seçenekleri her zaman isteğe bağlıdır (komut satırı kuralıdır), bu tür anahtarlarla hiçbir zaman istenen argümanlar belirtilmez. Bunun yerine komut satırı yardımı, gerekli argümanların add_argument()'a iletilen ilk argümana dayalı bir yer tutucuyla nereye ekleneceğini gösterecektir. İşte

args = parser.parse_args() 
if not args.inputdir: 
    parser.error('Please specify an inputdir with the -i or --inputdir option') 

parser.error() method yazdırır: Eğer o sözleşme ile kırmak ve zaten gereklidir - veya -- ile başlayan bir argüman kullanmak zorunda ise

, kendi denetimi yapmak gerekecek hata mesajınızla birlikte yardım bilgilerini girin ve ardından çıkın.

+0

Açıklama için çok teşekkür ederim! Yardımını çok takdir ediyorum. – user3621633

+0

Beğenmediğim şey, kullanımı yazdırdığı zaman, '-i' ve' --inputdir' basmıyor. Kullanımın kullanım şekli gibi olmasını istiyorum: [-h] [-i | --inputdir INPUTDIR] '; bu etki için bir şey. Muhtemelen bunu yapmanın bir yolu 'add_mutually_exclusive_group()' işlevini kullanmaktır, fakat bu bana biraz rahatsızlık verici geliyor. Daha iyi bir yol olup olmadığını merak ediyorum. – searchengine27

+0

@ searchengine27: [yardım biçimlendirici sınıfını] (https://docs.python.org/2/library/argparse.html#formatter-class) özelleştirmeniz gerekir, korkarım. –

İlgili konular