2016-08-23 20 views
5

Bu gibi benim komut dosyasını kullanmak istiyorum:argparse: İsteğe bağlı bağımsız değişkenler nasıl yapılır?

python test.py run 
python test.py stop 

ve benim kod şu şekildedir:

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group(required=True) 
command_group.add_argument('run', help='run it', action='store_true') 
command_group.add_argument('stop', help='stop it', action='store_true') 

bunu yürütmek

, bir özel duruma neden: böylece

ValueError: mutually exclusive arguments must be optional 

Her bağımsız değişkeni eklediğimde required=False eklemeyi denedim.O zaman başka bir özel durum olsun:

TypeError: 'required' is an invalid argument for positionals 

Kafam karıştı.

+0

Neden ['seçenekler'] (https://docs.python.org/3/library/argparse.html#choices) yerine bir mutex grubu kullanılır? – kennytm

cevap

4

Bunu yapmanın daha iyi bir yolu, iki seçeneğe sahip olabilecek tek bir konumsal argüman eklemektir. run verilir

parser = argparse.ArgumentParser() 
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop')) 

, değer 'run' olacak: Eğer bu isteğe olmak istiyorum beri sıfır veya bir kere anlamına gelen nargs='?' kullanın. stop verilirse, 'stop' olacaktır. Her ikisi de verilmezse, None olacaktır.


Gerçekten birbirinden ayrıcalıklı bir grup kullanmak isterseniz, tam olarak istediğiniz gibi yapılabileceğinden emin değilim. Sen Ancak tire ekleyerek onları isteğe bağlı argümanlar yapabilirsiniz:

import argparse 

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('-run', help='run it', action='store_true') 
command_group.add_argument('-stop', help='stop it', action='store_true') 

Tabii bu sorun kullanıcı aynı zamanda tire sağlamak gerekiyor, ama bu eğer bekleyebilirsiniz sorunun tür olmasıdır kendini böyle sınırlıyorsun.

+0

Teşekkürler, işe yarıyor. Ama mutex grubunu kullanmak istersem kodu nasıl yazmalıyım? – huron

+0

@huron: Yapabileceğinden emin değilim. Düzenlenmiş cevabımı görün. – zondo

+0

Anladım. Teşekkür ederim! – huron

1

Sen

python test.py run 

veya

python test.py stop 

ama değil

ile programı çağırmak için izin verecek Hangi nargs='?'

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('run', help='run it', nargs='?') 
command_group.add_argument('stop', help='stop it', nargs='?') 

ile bunu başarabilirsiniz

python test.py run stop 
İlgili konular